log4net 性能:我应该在尝试记录之前检查日志级别吗?

问题描述 投票:0回答:5

如果 log4net 配置中的日志级别设置为 Info 级别,您是否期望下面的 A) 或 B) 获得更好的性能? _log.Debug 本身会执行更多代码并花费更长的时间吗?

A)

if(_log.IsDebugEnabled)
  _log.Debug("some message");

B)

_log.Debug("some message");
c# log4net
5个回答
10
投票

在这种情况下,我会使用 B。

但是,如果构建日志消息(

log.Debug
的参数)可能需要一段时间(例如,涉及重要的字符串连接),那么我会选择 A。它最终会在“是的,记录它”的情况,但在“不,不要记录它”的情况下不需要构造日志消息。


4
投票

我会选择选项B,除非日志消息本身需要很长时间来构建。通常情况下的性能增益可以忽略不计,甚至不存在。在内部,log4net 会进行相同的检查,因此您自己不会更改任何内容。

但正如我所说,在这种情况下选项 A 可能是个好主意:

if (_log.IsDebugEnabled())
{
    var message = createComplicatedLogMessageThatTakesALotOfTime();
    _log.Debug(message);
}

对于所有其他情况,它只是为您记录的每条消息添加三行,这是不值得的。


2
投票

之前的分析表明 Log4Net 的

IsXXXEnabled
实现并不是最快的,因为它调用了其他几个方法。 NLog 的版本执行易失性读取,因此速度要快得多,但实际上,如果您的瓶颈在于
IsXXXEnabled
,那么您已经在做低延迟的事情,并且最终可能会编写自己的专用日志记录。


1
投票

尽管第一个选项的性能稍高一些,但我不会太担心。

但是如果你这样做:

_log.Debug(String.Format("{0} {1} {2}...", param1, param2, param3));

那么之前就有充分理由检查 _log.IsDebugEnabled。


-1
投票

选项 A 更好,因为:

你可能不知道 Debug() 方法后面包裹着什么。它是一个本地包装器,有人在传递给 log4net 的 Debug() 调用之前添加来处理额外的逻辑吗? log4net 在该方法中做了什么?您可能正在使用 log4net 的源代码来构建程序集,其他团队成员是否更改了它?好的,所以您亲自审核了代码,它非常快,并且您正在使用 Nuget 的程序集,因此您知道您的团队中没有人更改过它。明天新版本的 log4net 发布怎么办?你怎么知道处理 log4net bug 的人没有引入一些日志记录代码来融化你的服务器所有的紧密循环?下一个复制你的代码并对其进行更改的实习生是否和你一样知识渊博,并思考如何进行冗长复杂的日志调用可能比预期的成本更高?另外,请记住,不同的附加程序可能具有不同的日志成本。如果有人将轻量级快速异步附加程序更改为较慢的同步附加程序,会发生什么?

底线:防御性编码。这是一个非常简单且廉价的布尔检查,它可以防止大规模和负载下出现一些意外且棘手的性能问题。您是否会看着这张支票说:“我真的很后悔写了这张支票”?不太可能。

© www.soinside.com 2019 - 2024. All rights reserved.