C# 为什么在log4net中调用IsDebugEnabled?
我很好奇为什么我看到人们编写log4net日志代码,如下所示:C# 为什么在log4net中调用IsDebugEnabled?,c#,log4net,C#,Log4net,我很好奇为什么我看到人们编写log4net日志代码,如下所示: if (_logger.IsDebugEnabled) { _logger.Debug("Some debug text"); } 我已经完成了log4net的反汇编,调用Debug对同一代码进行了另一次调用,以查看它在实际记录之前是否已启用,因此IsDebugEnabled调用是不必要的,实际上是重复的代码 人们这样做有什么原因吗?也许旧模式在旧版本中曾经是必要的,但现在不再是了?或者有合法的理由吗?或者人们只是不知道他
if (_logger.IsDebugEnabled)
{
_logger.Debug("Some debug text");
}
我已经完成了log4net的反汇编,调用Debug对同一代码进行了另一次调用,以查看它在实际记录之前是否已启用,因此IsDebugEnabled调用是不必要的,实际上是重复的代码
人们这样做有什么原因吗?也许旧模式在旧版本中曾经是必要的,但现在不再是了?或者有合法的理由吗?或者人们只是不知道他们不需要这么做
其他级别(信息、错误、警告、最精细等)也存在同样的行为。构建消息的成本可能会很高。将其包装在
if
语句中可确保仅在必要时创建它
解决此问题的另一种模式是:
_logger.Debug(() => "Some expensive text");
不过,我不知道log4net是否支持类似的操作。对于某些操作,您可能需要进行计算或额外检查才能输出所需的日志消息 如果日志级别设置为高于调试级别,则不必执行所有这些工作,有时最好进行检查,因此,如果无论如何都不会记录日志,则可以防止执行额外的工作
例如页面加载时间,在调试模式下可以记录这些时间,但是如果不在调试级别,则不应创建秒表,并且应跳过计算。此模式纯粹用于性能原因,特别是当日志记录到某个日志记录级别时,将跳过该日志记录级别,因为该日志记录级别当前未启用。检查boolean
IsDebugEnabled
标志并跳过方法调用要比调用带有参数的Debug
方法和不记录就返回的方法便宜得多
如果要调用Debug
方法并传入包含创建成本高昂的内容的消息,可以通过首先检查enabled标志来跳过消息的创建
综上所述,除非您正在生成非常昂贵的日志消息(例如,堆栈跟踪之类的东西),或者您正在进行紧密循环的日志记录,否则它不太可能成为代码的瓶颈。即使没有,您也可以创建一个扩展方法。仍然需要额外的“()=>”,有什么改进的方法吗?这不仅仅是性能方面的原因。如果您已经在调试级别上记录了它,并且希望避免相同的信息再次记录在不同的日志级别上,该怎么办?然后可以使用此标志:
如果(!Log.IsDebugEnabled)Log.Error(某物)代码>。在这种情况下,有些东西并不昂贵,但你不需要重复同样的信息。多亏了你们三个人——看起来你们几乎是在同一时间打电话来的,但我认为布莱恩是第一个。我真的没有想到一条昂贵的消息——我通常做的任何日志记录都非常简单,通常只是一个字符串。但是,如果你有真正的代码触发,提前停止它肯定是有意义的。谢谢你的帮助。IsDebug和性能问题在IMHO上讨论过,用if语句包装每个日志调用是没有意义的。我只会在有意义的时候才这样做,也就是当要记录的值的计算非常昂贵时(比如DB调用或执行大量数据的操作)。对简单字符串concat的性能影响微乎其微,而包装会损害代码的可读性。您为每个日志语句添加了3行代码,这绝对是愚蠢的