为了账号安全,请及时绑定邮箱和手机立即绑定

在log4j中,在记录之前检查isDebugEnabled是否可以提高性能?

在log4j中,在记录之前检查isDebugEnabled是否可以提高性能?

慕勒3428872 2019-12-10 09:58:56
我在应用程序中使用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()方法调用的。我不认为如果我们logger.debug()在方法或类中编写多个语句,debug()然后根据选项1 调用方法,那么与选项2相比,它对Log4J框架来说是开销。因为这isDebugEnabled()是一个非常小的方法(就代码而言),因此成为内联的好人选。
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

在这种情况下,选项1更好。


isDebugEnabled()当它涉及调用toString()各种对象的方法并连接结果时,可以使用保护语句(检查)来防止对日志消息进行潜在的昂贵计算。


在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查是否启用记录器一样有效,并且由于分支较少,因此降低了代码的复杂性。


更好的方法是使用最新的日志记录框架,在该框架中,日志语句采用格式规范和由记录器替换的参数列表,但只有在启用记录器后才“懒惰”。这是slf4j采取的方法。


有关更多信息,请参见我对相关问题的答案,以及使用log4j进行此类操作的示例。


查看完整回答
反对 回复 2019-12-10
?
www说

TA贡献1775条经验 获得超8个赞

由于在选项1中消息字符串是一个常量,因此用条件包装换行记录语句绝对没有收益,相反,如果启用了调试语句,则将进行两次评估,一次在isDebugEnabled()方法中,一次在系统中。debug()方法。调用的成本isDebugEnabled()约为5到30纳秒,对于大多数实际目的而言应该可以忽略不计。因此,选项2是不理想的,因为它会污染您的代码,并且不会带来其他收益。


查看完整回答
反对 回复 2019-12-10
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

isDebugEnabled()通过串联字符串来构建日志消息时,保留使用:


Var myVar = new MyVar();

log.debug("My var is " + myVar + ", value:" + myVar.someCall());

但是,在您的示例中,您仅记录一个String而不执行诸如串联之类的操作就不会提高速度。因此,您只是在代码中添加了膨胀,使其难以阅读。


我亲自在String类中使用Java 1.5格式调用,如下所示:


Var myVar = new MyVar();

log.debug(String.format("My var is '%s', value: '%s'", myVar, myVar.someCall()));

我怀疑是否有很多优化,但是更容易阅读。


请注意,尽管大多数日志记录API都提供了开箱即用的格式:例如slf4j提供了以下内容:


logger.debug("My var is {}", myVar);

甚至更容易阅读。


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 424 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信