记录器的使用,参数化更好还是使用 + 添加参数?
logger usage, is parameterization better or using + to add arguments?
下面哪个是logger更好的用法?
参数化 (log4j 2)
logger.info("User {} has logged in using id {}", map.get("Name"), user.getId());`
使用 + 运算符 (log4j)
logger.info("User"+ map.get("Name") +" has logged in using id " +user.getId());`
为什么?
即使没有别的,使用 +
时发生的额外 StringBuilder shenanigans 也会使使用参数成为显而易见的选择。
更不用说在连接值时,即使未启用日志记录级别,也会调用所有参数的 toString()
方法,这意味着您正在浪费 CPU构建一个永远不会被记录的字符串。
如果在生产环境中通常禁用 DEBUG 级别时,如果有很多 debug()
语句,这将产生(尽管很小)影响。
Parameterized messages 在 Log4j 确定消息将被记录之前避免格式化文本。这使您可以避免使用 if (logger.isDebugEnabled())...
之类的检查来包围 logger.debug(...) 调用,从而提供更清晰的代码。
This answer is based on modern logging frameworks, not outdated ones like Log4J.
当您说 "outdated" 时,您一定是在谈论 Log4j 1.x。截至 2014 年,Log4j 2 是最前沿的开源日志记录框架。它采用了 SLF4J 的一些想法,例如 parameterized log messages, but adds a plugin system so you can easily add custom appenders, custom layouts and . Furthermore Log4j 2 has support for custom log levels, lambda expressions and the lock-free and very performant Async Loggers. To spice things up, from release 2.6 Log4j 2 is garbage-free.
Kayaman 可能在谈论 Log4j 1,自 2015 年 8 月以来一直 End of Life。
下面哪个是logger更好的用法?
参数化 (log4j 2)
logger.info("User {} has logged in using id {}", map.get("Name"), user.getId());`
使用 + 运算符 (log4j)
logger.info("User"+ map.get("Name") +" has logged in using id " +user.getId());`
为什么?
即使没有别的,使用 +
时发生的额外 StringBuilder shenanigans 也会使使用参数成为显而易见的选择。
更不用说在连接值时,即使未启用日志记录级别,也会调用所有参数的 toString()
方法,这意味着您正在浪费 CPU构建一个永远不会被记录的字符串。
如果在生产环境中通常禁用 DEBUG 级别时,如果有很多 debug()
语句,这将产生(尽管很小)影响。
Parameterized messages 在 Log4j 确定消息将被记录之前避免格式化文本。这使您可以避免使用 if (logger.isDebugEnabled())...
之类的检查来包围 logger.debug(...) 调用,从而提供更清晰的代码。
This answer is based on modern logging frameworks, not outdated ones like Log4J.
当您说 "outdated" 时,您一定是在谈论 Log4j 1.x。截至 2014 年,Log4j 2 是最前沿的开源日志记录框架。它采用了 SLF4J 的一些想法,例如 parameterized log messages, but adds a plugin system so you can easily add custom appenders, custom layouts and
Kayaman 可能在谈论 Log4j 1,自 2015 年 8 月以来一直 End of Life。