c# - 为什么要在 log4net 中调用 IsDebugEnabled?

标签 c# log4net

我很好奇为什么我看到人们编写如下 log4net 日志记录代码:

if (_logger.IsDebugEnabled)
{
    _logger.Debug("Some debug text");
}

我已经完成了 log4net 的反汇编,并且调用 Debug 会再次调用相同的代码以查看它是否在实际记录之前启用,因此 IsDebugEnabled 调用是不必要的,实际上是重复的代码。

人们这样做有什么原因吗?也许在旧版本中曾经需要但不再需要的旧模式?还是有正当理由?或者也许人们只是不知道他们不需要这样做?

其他级别(信息、错误、警告、最佳等)也有同样的行为。

最佳答案

此模式纯粹用于性能原因,特别是当记录到某个日志记录级别时将被跳过,因为当前未启用该日志记录级别。检查 bool 值 IsDebugEnabled 标志并跳过方法调用比使用参数调用 Debug 方法和不记录返回的方法要便宜得多。

如果您要调用 Debug 方法并传入包含创建成本很高的内容的消息,您可以通过首先检查启用标志来完全跳过消息的创建。

综上所述,除非您正在制作成本非常高的日志消息(例如堆栈跟踪之类的东西)或者您正在记录一个紧密的循环,否则它不太可能成为您代码的瓶颈.

关于c# - 为什么要在 log4net 中调用 IsDebugEnabled?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382928/

相关文章:

c# - Log4Net:如何向每个日志行添加简单索引器(行号)

c# - 在 .net 2.0 中存储非唯一对?

c# - 异步下载多个文件并等待所有文件完成,然后再执行其余代码

c# - 服务器-客户端推/拉连接如何工作?

c# - Log4net 对待异常的方式不同于其他日志消息

.net - 如何从 log4net 编辑敏感信息?

log4j - Log4Net 是面向消息的中间件吗?

c# - C#中的自动类型转换

C#区间树类

log4net - 来自 .net、用户模式和驱动程序的 ETW 跟踪