Log4j隐式字符串格式

Ros*_*iar 20 java logging log4j string-formatting

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

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

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

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

我错过了什么吗?此外,是否有支持这种情况的Java日志框架?

Yos*_*ner 31

slf4j的api提供了" 参数化日志记录 ",它允许你做到这一点,尽管语法略有不同.那里的例子是:

logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);
Run Code Online (Sandbox Code Playgroud)

对于实现,您可以使用本机实现slf4j的Logback,或者使用slf4j绑定来连接log4j或其他记录器.用户手册解释了这一点,以及一个简短的例子.


bob*_*alf 14

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

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

我尝试了一下,确实有效!我使用的是 log4j 2.11.2。

int i = 42;
String str1 = "the answer";
String str2 = "life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);
Run Code Online (Sandbox Code Playgroud)

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

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


Mat*_*ieu 11

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

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

  • “被认为是一种不好的做法”?? (2认同)