Log4j隐式字符串格式

时间:2015-06-22 08:17:23

标签: 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));

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

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

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

4 个答案:

答案 0 :(得分:14)

slf4j的api提供了“parameterized logging”,它允许您完全执行此操作,但语法略有不同。那个例子是:

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

slf4j允许您以

身份登录

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

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

答案 3 :(得分:0)

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