为什么需要在JBoss中使用isTraceEnabled()函数?

为什么需要在JBoss中使用isTraceEnabled()函数?,jboss,log4j,logging,Jboss,Log4j,Logging,我正在使用org.jboss.logging.Logger类,似乎遇到了不一致的地方。当出现错误或警告时,我只需使用logger.error(“错误消息”)或logger.warn(“警告消息”),它将根据jboss-log4j.xml文件中的设置显示 但是,根据现有jboss代码,在使用跟踪时,必须首先使用logger.isTraceEnabled()确定是否启用了跟踪。为什么我必须单独使用此跟踪功能?您不必“必须”。没有它,一切都会好的。然而,跟踪级别的日志记录往往非常冗长,可能会占用大量C

我正在使用org.jboss.logging.Logger类,似乎遇到了不一致的地方。当出现错误或警告时,我只需使用
logger.error(“错误消息”)
logger.warn(“警告消息”)
,它将根据jboss-log4j.xml文件中的设置显示

但是,根据现有jboss代码,在使用跟踪时,必须首先使用
logger.isTraceEnabled()
确定是否启用了跟踪。为什么我必须单独使用此跟踪功能?

您不必“必须”。没有它,一切都会好的。然而,跟踪级别的日志记录往往非常冗长,可能会占用大量CPU时间,即使它最终没有实际记录到文件中。通过在日志语句周围放置
if
检查,可以避免这种开销

我见过其他高质量的代码库也对调试和信息级日志记录执行相同的操作,因此它不仅限于跟踪


请参阅。

中的一节。明白了-所以这只是性能问题。这是有意义的,尤其是对于每个请求都会发生的信息级别的事情,正如您所知,这取决于您使用的记录器。例如,org.slf4j.impl.Log4jLoggerAdapter在内部执行此检查,因此您根本不需要执行此操作。我想,对于优秀的日志记录者来说,在内部执行此检查最有意义,特别是正如他们已经知道的那样……唯一的性能提升是,如果消息的构建方式不如调用isTraceEnabled()()@ndtreviv的效率,那么问题在于字符串构建的开销(如果字符串是构建的)和参数开销,如果字符串是按值传递的,那么现在必须为每个记录器调用一直执行到跟踪级别的操作,即使记录器在内部执行检查。例如,如果您的日志级别设置为WARN,并且您没有检查isTraceEnabled,那么这些跟踪日志字符串仍然必须构造,并且无缘无故地按值传递给记录器;这是不需要的额外处理。它是否可以忽略是另一个问题。