【问题标题】:Java logging performanceJava 日志记录性能
【发布时间】:2022-06-28 23:31:54
【问题描述】:

我正在使用 wildfly21 设置记录 level=INFO。在部署的代码中有很多 logger.debug 语句。

例如

private static Logger logger = LogManager.getLogger(getClass.getName());
logger.debug("Some debug message");

由于日志级别设置为 INFO,调试语句未正确记录到文件中。

我的问题是关于 logger.debug 的性能成本。

在代码中保留调试语句是否有任何性能成本。或者是文件 I/O 中的实际成本,因此在需要时保留调试语句以进行故障排除是没有害处的。

【问题讨论】:

  • Or is the real cost in the File I/O 我不是专家,但我相信真正的成本在 IO 中,所以你应该没问题。需要注意的一件事是像 logger.debug( "Concat " + i + " a " + param + " string " + x ); DO 这样的语句会产生构建字符串的成本。您应该替换一个不执行字符串连接的版本,除非该语句被实际记录:logger.debug( "Concat {0} a {1} string {2}", i, param, x );
  • 谢谢我完全忽略了成本字符串 concat。

标签: java logging wildfly


【解决方案1】:

当您的日志记录调用成本较低时,例如使用字符串文字(或@markspace 建议的字符串格式变体),您可以像上面一样使用 logger.debug

logger.debug("Some debug message");

但是,如果该语句具有副作用成本,例如:

logger.debug("Value of X="+x+" extra bits "+someSideEffect(y));

然后始终以检查日志记录级别作为前缀 - 大多数 Logger API 支持 isXYZEnabledlogger.isEnabled(Level.XYZ)

if(logger.isDebugEnabled())
    logger.debug("Value of X="+x+" extra bits "+someSideEffect(y));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2011-02-06
    • 1970-01-01
    • 2013-10-22
    • 2010-11-04
    相关资源
    最近更新 更多