我在我的应用程序中使用Log4J进行日志记录.以前我使用调试调用如:
选项1:
logger.debug("some debug text");
Run Code Online (Sandbox Code Playgroud)
但有些链接表明最好先检查一下isDebugEnabled(),例如:
选项2:
boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
logger.debug("some debug text");
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是" 选项2能否以任何方式提高性能? ".
因为在任何情况下Log4J框架都对debugEnabled进行相同的检查.对于选项2,如果我们在单个方法或类中使用多个调试语句可能是有益的,其中框架不需要isDebugEnabled()多次调用方法(在每次调用时); 在这种情况下,它只调用isDebugEnabled()一次方法,如果Log4J配置为调试级别,那么实际上它调用isDebugEnabled()方法两次:
我不认为如果我们logger.debug()在方法或类中编写多个语句并debug()根据选项1 调用方法,那么与选项2相比,它是Log4J框架的开销.因为它isDebugEnabled()是一个非常小的方法(就代码而言),它可能是内联的好人选.
当我浏览一些代码时,我注意到使用logger如下,
if(logger.isDebugEnabled())
logger.debug("Something..");
Run Code Online (Sandbox Code Playgroud)
但在某些代码中,我观察到了这样的情况.
logger.debug("Something..");
Run Code Online (Sandbox Code Playgroud)
当我查看log4j的源代码时,在debug()Logger本身的方法中 if(logger.isDebugEnabled())进行了检查.那为什么我们需要这种不必要的开销if(logger.isDebugEnabled())?
如何在实际记录调试语句之前检查是否启用了某个日志记录级别?
尽管在一些教程中,例如这里(参数化日志记录部分),说Logback消息{}参数化帮助我们避免日志记录数据中不必要的计算 (如果日志记录级别不是DEBUG):
logger.debug("The bonus for employee {} is {}",
employee.getName(), employeeService.calculateBonus(employee));
Run Code Online (Sandbox Code Playgroud)
我测试(在 logback 版本上1.2.3)该优化仅适用于不必要的toString()参数对象 - 因为这适用于log4j。
Logback文档不包含此细节。
那么,我们必须使用 isDebugEnabled() 来处理所有“昂贵”的日志记录,不是吗?