Log4j 隐式字符串格式化

Log4j Implicit String Formatting

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

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 日志框架?

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

slf4j 允许您登录为

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

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

slf4j's api provides "parameterized logging”,它允许您完全做到这一点,尽管语法略有不同。示例是:

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

对于实现,您可以使用本机实现 slf4j 的 Logback,或者使用 slf4j 绑定来连接 log4j 或其他记录器。 The User Manual 对此进行了解释,并提供了一个简短的示例。

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

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

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);

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

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