我在我的应用程序中使用 Log4J 进行日志记录。以前我使用的调试调用如下:
选项1:
logger.debug("some debug text");
但一些链接建议最好先检查 isDebugEnabled()
,例如:
选项 2:
boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
logger.debug("some debug text");
}
所以我的问题是“ 选项 2 是否以任何方式提高性能? ”。
因为在任何情况下,Log4J 框架都对 debugEnabled 进行相同的检查。对于选项 2,如果我们在单个方法或类中使用多个调试语句,那么框架不需要多次调用 isDebugEnabled()
方法(在每次调用时);在这种情况下,它只调用 isDebugEnabled()
方法一次,如果 Log4J 配置为调试级别,那么它实际上调用 isDebugEnabled()
方法两次:
- 如果为 debugEnabled 变量赋值,并且
- 实际上由 logger.debug() 方法调用。
我不认为如果我们根据选项 1 在方法或类中编写多个 logger.debug()
语句并调用 debug()
方法,那么与选项 2 相比,它是 Log4J 框架的开销。因为 isDebugEnabled()
是一个非常小的方法(就代码而言),它可能是内联的好候选者。
原文由 Silent Warrior 发布,翻译遵循 CC BY-SA 4.0 许可协议
在这种特殊情况下,选项 1 更好。
保护语句(检查
isDebugEnabled()
)是为了防止在涉及调用各种对象的toString()
方法并连接结果时对日志消息进行潜在的昂贵计算。在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查记录器是否启用一样高效,并且它降低了代码的复杂性,因为分支更少。
更好的方法是使用更新的日志记录框架,其中日志语句采用格式规范和要由记录器替换的参数列表——但是“懒惰地”,仅当启用记录器时。这是 slf4j 所采用的方法。
有关更多信息,请参阅 我对相关问题的回答,以及使用 log4j 执行此类操作的示例。