我在应用程序中使用Log4J进行日志记录。以前我使用像下面这样的调试调用:
选项1:
logger.debug("some debug text");
但有些链接建议最好先检查一下isDebugEnabled(),例如:
isDebugEnabled()
选项2:
boolean debugEnabled = logger.isDebugEnabled(); if (debugEnabled) { logger.debug("some debug text"); }
所以我的问题是“ 选项2是否会以任何方式提高性能? ”。
因为在任何情况下,Log4J框架都对debugEnabled进行相同的检查。对于选项2,如果我们在单个方法或类中使用多个debug语句,则该框架可能是有益的,在该方法或类中,框架不需要isDebugEnabled()多次调用方法(每次调用);在这种情况下,它isDebugEnabled()仅调用一次方法,并且如果Log4J配置为调试级别,则实际上它isDebugEnabled()两次调用方法:
我不认为如果我们logger.debug()在方法或类中编写多个语句,debug()然后根据选项1 调用方法,那么与选项2相比,它对Log4J框架来说是开销。因为这isDebugEnabled()是一个非常小的方法(就代码而言),所以它可能成为内联的好人选。
logger.debug()
在这种特定情况下,选项1更好。
isDebugEnabled()当涉及到调用toString()各种对象的方法并连接结果时,保护语句(检查)可以防止对日志消息进行潜在的昂贵计算。
toString()
在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查是否启用记录器一样有效,并且由于分支较少,因此降低了代码的复杂性。
更好的方法是使用最新的日志记录框架,在该框架中,日志语句采用格式规范和由记录器替换的参数列表,但只有在启用记录器后才“懒惰”。这是slf4j采取的方法。