当前位置: 首页 > 知识库问答 >
问题:

Will log4j。rootLogger=调试时没有附加器对该级别的性能有影响吗?

董花蜂
2023-03-14

让我们想象一个场景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记录器中的大量信息写入,因为我设置了log4j.appender.default.file.threshold=INFO,所以只会写入INFO。但是我在DEBUG上设置的rootLogger怎么样?

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

共有1个答案

丌官信厚
2023-03-14

方案B会比方案C好一点。

最慢的速度来自于附加程序将日志写入文件。
但是,即使没有附加程序,记录器的执行也会变慢,因为当记录器通过当前消息的日志级别时,您需要执行每个日志消息的代码来检查当前附加程序。这将更经常地发生在场景C中。

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

if(logger.isEnabledFor(Level.DEBUG)) {
    logger.debug("message: " + object.expensiveToString())
}
 类似资料:
  • 我运行Http服务器使用Netty I/O库在四核Linux机器上。使用默认工作线程池大小(在Netty中内部设置为2 x内核数)运行时,性能分析显示吞吐量上限为1k请求/秒,请求速率的进一步增加导致延迟几乎线性增加。 由于最大CPU利用率显示为60%,我根据下面的代码增加了工作线程的数量。然而,性能几乎没有任何变化,CPU仍然限制在60-70%。该进程不受内存、I/O或网络带宽的限制。为什么不通

  • 问题内容: 我试图在接收每月数百万次页面浏览量的页面中找到一些简单的客户端性能调整。我关心的一个问题是使用CSS通用选择器()。 例如,考虑一个非常简单的HTML文档,如下所示: 通用选择器会将以上声明应用于,和元素,因为它们是文档中唯一的那些。 通常,我会从以下规则中看到更好的性能: 还是会产生完全相同的净效果? 通用选择器是否执行我可能不知道的更多工作? 我意识到该示例中的性能影响可能很小,但

  • (当然,我还在一些试验中添加了,但这不会有什么不同) 为了检查结果是否与1.6实际兼容,我将得到的jar、解压缩到文件夹中,并在遇到的第一个文件上使用。但是无论我是否设置了目标兼容性,或者我是否使用1.5而不是1.6或者我是否将其指定为字符串(),每次javap的结果都是 这意味着它是Java1.7字节码,这是错误的。 有什么想法为什么-设置不起作用吗?还是不是检查兼容性的正确方法? 更新:是的,

  • 我对Spring请求映射的内部工作很好奇。在类级别使用requestmapping注释是否会加快解析请求的控制器? 在Spring Boot中@RequestMapping如何在内部工作?-阅读这个答案和类似的答案。控制器和URL是否在初始启动期间映射并存储在注册表中?因为我在启动Spring Boot应用程序时发现了这些日志跟踪。 控制器+方法和URL是最初在启动期间映射的,还是每次为请求迭代?

  • 问题内容: 这 比这慢 但是呢? 我的测试表明第二个和第三个示例完全相同。如果是这样,我的问题是,为什么要使用“ =”? 问题答案: 使用绑定变量时,有一个明显的区别,绑定变量应该在Oracle中用于数据仓库或其他批量数据操作以外的其他任何操作。 以下列情况为例: Oracle在执行之前不知道:b1的值为’%some_value%’或’some_value’等,因此它将根据启发式方法估计结果的基数

  • 问题内容: 我使用Netbeans GUI Builder创建了一个GUI(称为ParameterUI),现在我想创建它的一个实例并显示它。但是,使用 不会导致任何窗口出现…测试表明,在这些命令之后,gui.isVisible()返回true,但是gui.isValid()为false。调用gui.revalidate()也无效。 在ParameterUI类中,构造函数方法由Netbeans生成,