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,我认为它实现了这种方法
-
查找示例并发布答案,我可以接受:-)
slf4j的api提供了"参数化日志记录",尽管语法略有不同,但您可以执行此操作。示例如下:
1
| logger.debug("Value {} was inserted between {} and {}.", newVal, below, above); |
对于实现,您可以使用本地实现slf4j的Logback,也可以使用slf4j绑定与log4j或其他记录器连接。用户手册对此进行了解释,并附有简短示例。
-
仅用于其他信息(与此同时可能已更改):普通的log4j API也支持此信息。 可以使用与您已经编写的代码相同的代码。
使用String.format,+或除日志系统提供的字符串格式化程序以外的字符串格式化程序(例如,log4j)被认为是不好的做法。通常,在代码中有很多您不想在生产中看到的低级日志(调试,信息)。例如,如果使用String.format格式化要记录的字符串,则将生成并格式化一个新字符串,该字符串可能会很长并且会占用资源,即使最后不会记录任何内容(例如,如果log4j最低级别设置为警告或错误)。
通过使用记录器格式化程序系统(如log4j中的系统),可以使记录器避免在不需要记录格式化字符串的情况下避免生成它。
在某些情况下,这可能会有很大的不同。
-
"被认为是不良做法"?
-
请详细说明为什么多数民众赞成在不良做法。 另外,还有一个后续问题(我认为是OP的实际问题),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
-
除了我个人的喜好以外,建议最佳实践是使用String.format(),通常是因为它更易于阅读和修改:stackoverflow.com/questions/925423/