我有一个关于性能的问题log4j日志,在我的项目中,我在类中看到很多日志消息。在生产环境中,日志不打印许多这些(正常的行为)。无论如何,每个日志都会创建一个字符串对象。例如:Log4j性能和对象创建
Log.debug("This my debug message 1");
...
Log.debug("This my debug message 400");
我们为日志创建了很多字符串文字。这对我的生产现场是否会有相当大的影响,即使我只显示错误级别?
由于
我有一个关于性能的问题log4j日志,在我的项目中,我在类中看到很多日志消息。在生产环境中,日志不打印许多这些(正常的行为)。无论如何,每个日志都会创建一个字符串对象。例如:Log4j性能和对象创建
Log.debug("This my debug message 1");
...
Log.debug("This my debug message 400");
我们为日志创建了很多字符串文字。这对我的生产现场是否会有相当大的影响,即使我只显示错误级别?
由于
固定字符串文字是没有问题的,存在与该相关联的(除了该方法调用自身)没有运行时开销。
不同的情况下构造消息如"user: " + user
。即使日志未处于活动状态,字符串连接也会完成。
它可以,如果构造日志字符串相当复杂(例如调用一个对象上的复杂toString
)。
在你的情况(简单的字符串日志),它可能不值得写保护:
if (Log.isDebugEnabled()) {
Log.debug("...");
}
这是一个性能问题,基本上沸腾降至:衡量它! 我们不知道有多少“很多”的日志消息,你的其他代码的价格是多少等等。太多的因素给出了一个很好的答案。
我觉得一般的理解是,在大多数情况下合理的日志报表应该不会影响性能显着和它的便宜,使用更快的硬件比具有开发删除日志报表。但是这可能不包括你的具体情况。
记录能得到贵了不少,如果日志消息是不是文字但生成的字符串(字符串连接或复杂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());
}
OP正在谈论_string literals_,虽然你的提示是正确的。 – Seelenvirtuose
这就是为什么大多数较新的日志框架(例如Log4J 2.x)允许格式模板样式消息:'logger.debug(“Entry number:{} is {}”,i,entry [i]);'。如果你可以用这种方式生成你的日志消息,那么这可能是一条可行的路(减少混乱 - 仍然是一行代码)。 – sruetti
使用警卫为简单的日志语句没有任何意义。当日志处于不活动状态时,只需将一个方法调用替换为另一个方法调用即可,当日志处于活动状态时,将执行两次调用而不是一次调用 – Henry