关于java:Log4j隐式字符串格式

Log4j Implicit String Formatting

我正在使用log4j v1.2.14登录项目,也正在使用Java 7 String.format()将变量放入输出中。 目前我正在写

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

这真的是输出字符串的最佳方法吗? 我觉得log4j应该对此隐式实现,如下所示:

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

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


slf4j的api提供了"参数化日志记录",尽管语法略有不同,但您可以执行此操作。示例如下:

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

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


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

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


Log4j支持内部格式化。我还没有在任何地方记录它,但是我在这里看到了一个例子:

https://logging.apache.org/log4j/2.x/manual/markers.html

我尝试了一下,它有效!我在log4j 2.11.2上。

1
2
3
4
int i = 42;
String str1 ="the answer";
String str2 ="life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);

查看Logger的javadoc,我想说它是在Lo4j 2中引入的,最多支持10个参数。

https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Logger.html


顺便说一句,在这种情况下,使用+将变量添加到字符串和String.format之间没有太大区别-除非您真的想在所有日志中重用" Your var is ..."。

slf4j让您以

log.info("Your var is {} and you are {}", myVar, myVar1);

请注意使用{}而不是打印格式化程序。而且这需要Java> = 1.5