即使将级别设置为info,记录器也总是读取调试吗,它是否有重大影响?

Lun*_*ell 4 java logging

如标题所说。如果我有一个

LOGGER.debug(model.toString())
Run Code Online (Sandbox Code Playgroud)

并且我将日志记录级别设置为INFO,将始终执行该行,如果是,那么,如果您有很多调试日志记录,会产生很大的影响吗?我已经看到一些应用程序具有名为debug = true的属性,并且在代码中类型为

if(debug) {
    LOGGER.debug("log message");
}
Run Code Online (Sandbox Code Playgroud)

这是一个更好的方法,还是我应该继续使用LOGGER.debug()而不进行属性检查?

VGR*_*VGR 7

日志记录类只是普通的Java类。

如果您的代码中有一个方法调用,它将被调用。

但是…如果未启用相关级别,则所有日志记录框架的日志方法均设计为立即返回,这使得整个方法调用的成本非常低,基本上没有任何花费。因此,您几乎永远不应使用if (debug)if (logger.isDebugEnabled())。他们根本没有节省时间。

但是,普通的Java方法仍然是普通的Java方法。执行此命令时:

LOGGER.debug(model.toString());
Run Code Online (Sandbox Code Playgroud)

Java将首先调用model.toString(),然后将其结果传递给记录器。与logger调用不同,如果toString方法执行大量工作和/或非常频繁地调用,则toString 可能会很昂贵。为了解决此问题,日志记录框架具有参数化的日志方法,仅当启用了相关级别时,该方法才会将参数转换为字符串。

使用java.util.logging.Logger,它看起来像这样:

logger.log(Level.FINE, "Model={0}", model);     // no toString() call
Run Code Online (Sandbox Code Playgroud)

使用SLF4J或Log4j:

logger.debug("Model={}", model);                 // no toString() call
Run Code Online (Sandbox Code Playgroud)

  • @cjo 不,不会。在调用该方法时,您已经调用了 toString() 和 String.format。 (2认同)