Log4j 隐式字符串格式化

新手上路,请多包涵

我正在使用 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 日志记录框架?

原文由 Rossiar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

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

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

原文由 Yosef Weiner 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 String.format+ 或日志系统提供的字符串格式化程序以外的字符串格式化程序( log4j 被认为是一种不好的做法)

通常,在代码中有很多您不想在生产中看到的低级日志(调试、信息)。例如,如果您使用 String.format 来格式化要记录的字符串,那么您将在堆上分配并格式化一个新的 String ,它可能很长并且消耗资源,即使在最后不会记录任何内容(例如,如果 log4j 最小级别设置为警告或错误)。

通过使用记录器格式化程序系统(如来自 log4j 的系统),您可以让记录器避免生成不需要记录的格式化字符串。

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

原文由 Mathieu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题