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