首页 > 解决方案 > 没有附加器的 log4j.rootLogger=DEBUG 会影响性能吗?

问题描述

让我们想象一个场景 A,其中我有 log4j.rootLogger=DEBUG 和具有相同日志记录级别的文件附加程序:

log4j.rootLogger=DEBUG, default.out, default.file 

log4j.appender.default.file=org.apache.log4j.RollingFileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=log/error.log
log4j.appender.default.file.threshold=DEBUG
log4j.appender.default.file.MaxFileSize=10240KB
log4j.appender.default.file.MaxBackupIndex=100
log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

现在我们将与场景 B 进行比较:

log4j.rootLogger=INFO, default.out, default.file 

log4j.appender.default.file=org.apache.log4j.RollingFileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=log/error.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.MaxFileSize=10240KB
log4j.appender.default.file.MaxBackupIndex=100
log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

我知道场景 A 会比 B 更冗长,影响我的软件性能日志。但是现在,让我们与另一个场景 C 进行比较,其中我将 rootLogger 放入 DEBUG,但将 appender 放入 INFO:

log4j.rootLogger=DEBUG, default.out, default.file 

log4j.appender.default.file=org.apache.log4j.RollingFileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=log/error.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.MaxFileSize=10240KB
log4j.appender.default.file.MaxBackupIndex=100
log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

我的 log4j 创建的文件不会写入来自 DEBUG logger 的大量信息,因为我设置log4j.appender.default.file.threshold=INFO了 ,所以只会写入 INFO。但是我在 DEBUG 上设置的 rootLogger 怎么样?

会对性能产生影响吗log4j.rootLogger=DEBUG?scneario B 会比 scnario C 更有效吗?

标签: javalogginglog4j

解决方案


场景 B 会比场景 C 好一点。

最慢的速度来自 appender 将日志写入文件。在这两种情况下,这种影响是相同的。
但是,即使没有任何附加程序,记录器的执行也会减慢,因为当记录器通过当前消息的日志级别时,您需要为每个日志消息执行代码以检查当前附加程序。这在场景 C 中会更频繁地发生。

同样在某些代码中,通过首先检查日志级别来保护昂贵日志消息的创建。在场景 C 中,这段代码仍然被执行,而在场景 B 中,它被跳过并且执行速度更快,例如:

if(logger.isEnabledFor(Level.DEBUG)) {
    logger.debug("message: " + object.expensiveToString())
}

推荐阅读