记录器用法,参数化更好还是使用+来添加参数?

时间:2016-04-29 06:13:51

标签: java apache log4j log4j2

以下哪项更适合使用记录器?

  1. 参数化(log4j 2)

    logger.info("User {} has logged in using id {}", map.get("Name"), user.getId());`
    
  2. 使用+运算符(log4j)

    logger.info("User"+ map.get("Name") +" has logged in using id " +user.getId());`
    
  3. 为什么?

2 个答案:

答案 0 :(得分:0)

即使没有其他内容,使用+时发生的额外StringBuilder shenanigans会使参数显而易见。

更不用说在连接值时,即使未启用日志记录级别,也会调用所有参数的toString()方法,这意味着您正在浪费CPU来构建永远不会发生的字符串被记录。 如果在生产环境中通常禁用DEBUG级别时,如果有大量debug()语句,则会产生(尽管是次要的)影响。

这个答案是基于现代日志框架,而不是像Log4J那样过时的日志框架。

答案 1 :(得分:0)

Parameterized messages避免格式化文本,直到Log4j确定将记录该消息。这样可以避免使用if (logger.isDebugEnabled())...之类的检查来围绕logger.debug(...)调用,从而提供更清晰的代码。

  

这个答案是基于现代日志框架,而不是像Log4J那样过时的日志框架。

当你说"过时"你一定是在谈论Log4j 1.x.截至2014年,Log4j 2是最前沿的开源日志框架。它需要来自SLF4J的一些想法,例如parameterized log messages,但添加了一个插件系统,因此您可以轻松添加custom appenders,自定义布局和custom lookups。此外,Log4j 2支持custom log levelslambda expressions以及无锁且性能非常高的Async Loggers。为了增加趣味,从版本2.6开始,Log4j 2为garbage-free

Kayaman可能正在谈论Log4j 1,自2015年8月以来一直是End of Life