我很好奇为什么我会看到人们编写如下的log4net日志记录代码:
if (_logger.IsDebugEnabled)
{
_logger.Debug("Some debug text");
}
我已经完成了对log4net的反汇编,并调用Debug再次调用相同的代码,看看它是否在实际记录之前被启用,因此IsDebugEnabled调用是不必要的,实际上是重复的代码。
人们有这样的理由吗?也许旧的版本曾经是旧版本中的必需品,但现在不再存在了?或者它有合理的理由吗?或者也许人们只是不知道他们不需要这样做?
同样的行为也适用于其他级别(信息,错误,警告,最好等)。
答案 0 :(得分:15)
此模式纯粹出于性能原因而使用,特别是在跳过某个日志记录级别时,因为当前未启用日志记录级别。检查布尔IsDebugEnabled
标志并跳过方法调用比调用带有参数的Debug
方法和没有记录的方法返回要便宜得多。
如果您要调用Debug
方法并传入包含创建成本高昂的内容的消息,则可以首先检查已启用的标记,完全跳过消息的创建。
所有这一切,除非您制作非常昂贵的日志消息(例如,类似于堆栈跟踪)或者您正在紧密循环中登录,否则它不太可能成为您的代码的瓶颈
答案 1 :(得分:12)
构建消息可能很昂贵。将其包含在if
语句中可确保仅在必要时创建它。
解决此问题的另一种模式是:
_logger.Debug(() => "Some expensive text");
我不知道log4net是否支持这样的东西。
答案 2 :(得分:6)
对于某些操作,您可能需要进行计算或额外检查才能输出所需的日志消息。
如果将日志级别设置为高于DEBUG,则有时可以更好地检查所有这些工作,因此如果不进行任何记录,则无法执行额外的工作。
一个例子可能是页面加载时间,在调试模式下它们可以被记录,但是如果不是在DEBUG级别,则不应该创建秒表并且应该跳过计算。