【问题标题】:Log4j Implicit String FormattingLog4j 隐式字符串格式化
【发布时间】:2015-09-07 14:44:00
【问题描述】:

我使用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 日志框架支持这一点?

【问题讨论】:

  • 看看slf4j,我认为它实现了这种方法
  • 查找示例并作为答案发布,我可以接受:-)

标签: java logging log4j string-formatting


【解决方案1】:

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

slf4j 让你登录为

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

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

【讨论】:

【解决方案2】:

slf4j 的 api 提供了“parameterized logging”,它允许您完全做到这一点,尽管语法略有不同。那里的例子是:

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

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

【讨论】:

  • 只是为了获得更多信息(也许这同时已经改变了):普通的 log4j API 也支持这一点。可以使用您已经编写的相同代码。
【解决方案3】:

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

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

【讨论】:

  • “被认为是一种不好的做法”??
  • 请详细说明为什么这是不好的做法。另外,一个后续问题(我认为是 OP 的实际问题),log4j 提供的字符串格式化程序是什么?存在吗?
  • 这与所询问的内容有点偏离主题,但这正是我正在寻找的内容(为什么 log4j 参数比使用 String.format 更好)。谢谢。额外资源:slf4j.org/faq.html#logging_performance
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多