2017-03-16 147 views
0

我有一个关于性能的问题log4j日志,在我的项目中,我在类中看到很多日志消息。在生产环境中,日志不打印许多这些(正常的行为)。无论如何,每个日志都会创建一个字符串对象。例如:Log4j性能和对象创建

Log.debug("This my debug message 1"); 
... 
Log.debug("This my debug message 400"); 

我们为日志创建了很多字符串文字。这对我的生产现场是否会有相当大的影响,即使我只显示错误级别?

由于

回答

0

固定字符串文字是没有问题的,存在与该相关联的(除了该方法调用自身)没有运行时开销。

不同的情况下构造消息如"user: " + user。即使日志未处于活动状态,字符串连接也会完成。

2

它可以,如果构造日志字符串相当复杂(例如调用一个对象上的复杂toString)。

在你的情况(简单的字符串日志),它可能不值得写保护:

if (Log.isDebugEnabled()) { 
    Log.debug("..."); 
} 

http://logging.apache.org/log4j/1.2/manual.html(底部“性能”一节)

+0

OP正在谈论_string literals_,虽然你的提示是正确的。 – Seelenvirtuose

+1

这就是为什么大多数较新的日志框架(例如Log4J 2.x)允许格式模板样式消息:'logger.debug(“Entry number:{} is {}”,i,entry [i]);'。如果你可以用这种方式生成你的日志消息,那么这可能是一条可行的路(减少混乱 - 仍然是一行代码)。 – sruetti

+0

使用警卫为简单的日志语句没有任何意义。当日志处于不活动状态时,只需将一个方法调用替换为另一个方法调用即可,当日志处于活动状态时,将执行两次调用而不是一次调用 – Henry

0

这是一个性能问题,基本上沸腾降至:衡量它! 我们不知道有多少“很多”的日志消息,你的其他代码的价格是多少等等。太多的因素给出了一个很好的答案。

我觉得一般的理解是,在大多数情况下合理的日志报表应该不会影响性能显着和它的便宜,使用更快的硬件比具有开发删除日志报表。但是这可能不包括你的具体情况。

记录能得到贵了不少,如果日志消息是不是文字但生成的字符串(字符串连接或复杂toString() - 方法。)有丰富的信息,看手册的性能部分为log4j 1.x.log4j 2.x

删除日志语句可能是premature optimization的情况下,尽管它是没有任何错误尽量减少开销(至少在临界区)。 Log4j中可以做到这一点(的建议):

  • 使用格式模板样式消息(因为log4j的2.0提供):

    logger.debug("Entry number: {} is {}", i, entry[i]); 
    
  • 使用警卫

    if (logger.isDebugEnabled()) { 
        logger.debug(expensiveMethodReturningLogString()); 
    }