Log4j 隐式字符串格式化

2022-09-01 02:25:04

我用于在我的项目中进行日志记录,并且我还使用String.format()将变量放在我的输出中。目前我正在写log4j v1.2.14Java 7

LOGGER.info(String.format("Your var is [%s] and you are [%s]", myVar, myVar1));

这真的是输出字符串的最佳方式吗?我觉得应该隐含地实现如下:log4j

LOGGER.info("Your var is [%s] and you are [%s]", myVar, myVar1);

我错过了什么吗?此外,是否有任何Java日志记录框架支持此功能?


答案 1

slf4j的api提供了“参数化日志记录”,它允许您完全做到这一点,尽管语法略有不同。示例如下:

logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);

对于实现,您可以使用Logback在本机实现slf4j,或者使用slf4j绑定与log4j或其他记录器连接。用户手册对此进行了解释,并附有一个简短示例。


答案 2

使用 、 或日志系统提供的字符串格式化程序(例如)以外的字符串格式化程序被认为是一种不好的做法。通常,在代码中有很多你不想在生产中看到的低级日志(调试、信息)。例如,如果您使用来格式化要记录的字符串,那么您将生成并格式化一个新字符串,该字符串可能很长并消耗资源,即使最后不会记录任何内容(例如,如果最小级别设置为警告或错误)。通过使用记录器格式化程序系统(如 来自 的系统),您可以允许记录器避免生成不需要记录的格式化字符串。String.format+log4jString.formatlog4jlog4j

在某些情况下,这可能会有很大的不同。


推荐