为什么在log4net中调用IsDebugEnabled?

时间:2010-12-07 23:54:55

标签: c# log4net

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

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

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

人们有这样的理由吗?也许旧的版本曾经是旧版本中的必需品,但现在不再存在了?或者它有合理的理由吗?或者也许人们只是不知道他们不需要这样做?

同样的行为也适用于其他级别(信息,错误,警告,最好等)。

3 个答案:

答案 0 :(得分:15)

此模式纯粹出于性能原因而使用,特别是在跳过某个日志记录级别时,因为当前未启用日志记录级别。检查布尔IsDebugEnabled标志并跳过方法调用比调用带有参数的Debug方法和没有记录的方法返回要便宜得多。

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

所有这一切,除非您制作非常昂贵的日志消息(例如,类似于堆栈跟踪)或者您正在紧密循环中登录,否则它不太可能成为您的代码的瓶颈

答案 1 :(得分:12)

构建消息可能很昂贵。将其包含在if语句中可确保仅在必要时创建它。

解决此问题的另一种模式是:

_logger.Debug(() => "Some expensive text");

我不知道log4net是否支持这样的东西。

答案 2 :(得分:6)

对于某些操作,您可能需要进行计算或额外检查才能输出所需的日志消息。

如果将日志级别设置为高于DEBUG,则有时可以更好地检查所有这些工作,因此如果不进行任何记录,则无法执行额外的工作。

一个例子可能是页面加载时间,在调试模式下它们可以被记录,但是如果不是在DEBUG级别,则不应该创建秒表并且应该跳过计算。