是否 "Logging with slf4j at warn level"、防止 运行 "logger.debug(..."

Does "Logging with slf4j at warn level", prevent the running "logger.debug(..."

我有一个关于根据级别处理日志行的问题,例如;

logger.debug("hello i am a log line not so neccessary, also log level is setted WARN and some complexProcessResult-> {}",
doSomeWorkwhichTakeslongTime());

如果记录器级别设置为 WARN,那么它会调用进程“doSomeWorkwhichTakeslongTime()”,因为对一些 类 进行 jsonizing 会花费很多时间,我不想 运行 在生产中这样做。为此,将日志级别设置为“警告”是否足够?

不,如果您使用此特定方法调用,那么更改日志级别不会影响 doSomeWorkWhichTakesLongTime() 是否被调用。

它不能有效果,因为Java语言规定在调用方法之前需要计算参数值。

有两种可能的解决方法:

“丑陋”的一种是使用isDebugEnabled():

if (logger.isDebugEnabled()) {
    logger.debug("hello i am a log line not so neccessary, also log level is setted WARN and some complexProcessResult-> {}", doSomeWorkwhichTakeslongTime());
}

另一个有点棘手,但可能更好:在一个对象的 toString() 中进行繁重的工作,该对象要么构造成本低,要么您无论如何都可以访问:

logger.debug("hello i am a log line not so neccessary, also log level is setted WARN and some complexProcessResult-> {}", someObjectThatDescribesTheOutput)

并且 someObjectThatDescribesTheOutput 有一个 toString 方法,有点像这样:

public String toString() {
  return doSomeWorkwhichTakeslongTime();
}