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

LOGGER.debug(model.toString())

并且我将日志记录级别设置为INFO,将始终执行该行,如果这样,如果您有大量调试日志记录,会产生很大的影响吗?
我已经看到了一些应用程序,它们具有名为debug = true的属性,并且在代码中类型为
if(debug) {
    LOGGER.debug("log message");
}

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

最佳答案

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

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

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

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

LOGGER.debug(model.toString());

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

使用java.util.logging.Logger,它看起来像这样:
logger.log(Level.FINE, "Model={0}", model);     // no toString() call

使用SLF4J或Log4j:
logger.debug("Model={}", model);                 // no toString() call

关于java - 即使将级别设置为info,记录器也始终会读取调试信息,这是否会产生重大影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48828503/

10-17 00:24