log4j.rootlogger=在没有附加器的情况下进行调试会影响性能吗?

8mmmxcuj  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(265)

让我们设想一个场景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置于调试状态,但将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创建的文件不会使用调试记录器中的大量信息编写,因为我设置了 log4j.appender.default.file.threshold=INFO ,因此只会写入信息。但是我的rootlogger设置为debug怎么样?
意志 log4j.rootLogger=DEBUG 对性能产生影响?scneario b会比scnario c更高效吗?

piv4azn7

piv4azn71#

方案b将比方案c好一点。
最慢的速度来自appender将日志写入文件。这两种情况下的影响是相同的。
但是,即使没有任何appender,记录器的执行也会减慢,因为当记录器已超过当前消息的日志级别时,您需要为每个日志消息执行代码,以检查当前appender。这在场景c中更常见。
此外,在某些代码中,通过首先检查日志级别来保护昂贵日志消息的创建。在场景c中,此代码仍在执行,而在场景b中,此代码被跳过,执行速度更快,例如:

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

相关问题