Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在log4net中调用IsDebugEnabled?_C#_Log4net - Fatal编程技术网

C# 为什么在log4net中调用IsDebugEnabled?

C# 为什么在log4net中调用IsDebugEnabled?,c#,log4net,C#,Log4net,我很好奇为什么我看到人们编写log4net日志代码,如下所示: if (_logger.IsDebugEnabled) { _logger.Debug("Some debug text"); } 我已经完成了log4net的反汇编,调用Debug对同一代码进行了另一次调用,以查看它在实际记录之前是否已启用,因此IsDebugEnabled调用是不必要的,实际上是重复的代码 人们这样做有什么原因吗?也许旧模式在旧版本中曾经是必要的,但现在不再是了?或者有合法的理由吗?或者人们只是不知道他

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

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行代码,这绝对是愚蠢的