c# - 记录正确

标签 c# logging log4net c#-2.0

所以我的问题是关于日志记录,以及如何处理可能影响您的代码和运行时行为的日志语句。

日志文件...每个程序都应编写这些文件以正确解决问题,但如何正确执行?

大多数日志语句的获取成本都非常高,因为它们应该提供有用的信息,而且即使完全禁用日志记录,它们也会始终构建。

日志记录可以通过 xmls、inCode 或某些设置等进行配置,但这并不能解决字符串构建问题。

例如,下面的代码总是加载一个巨大的惰性加载树,在正常执行期间永远不会完全加载。

整个树的创建只是为了这条日志语句显示在日志文件中

(好的,我知道...,但这只是大多数程序中存在的所有复杂日志记录方法的替代品,在正常发布执行期间不应执行这些方法)

public void SomeMethod(){
    logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}

方法 someObject.GetHeavyDescriptionFromLazyTree() 总是被调用,即使日志记录被关闭,所以对于这个问题有一些常见的解决方案,比如:

public void SomeMethod(){
#if DEBUG
    logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
#endif       
}

public void SomeMethod(){
    if(logger.DoLogDebug())
        logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}

我认为#if DEBUG 编译器标志显然不是生成代码的解决方案。 如果我使用 logger.DoLogDebug(),则会有过多的代码来检查日志记录是否已启用...所以这也不是解决方案。

我认为 ConditionalAttribute 可以提供帮助,但它也绑定(bind)到编译器标志,并且它不会停用对 GetHeavyDescriptionFromLazyTree 的调用

[Conditional("DEBUG")]  
public void Debug(string debugMessage) 
{ 
    Console.WriteLine(debugMessage); 
} 

所以我正在寻找一个日志记录解决方案

  • 没有用调试语句过度破坏我的源代码
  • 日志级别是在运行时而不是编译时决定的
  • 只有在必要时才解析语句(logLevel > definedLogLevel)

最佳答案的额外日志行;-)

已编辑:我正在寻找 .NET 2.0 中的解决方案

最佳答案

“惰性日志记录”的一种方法是使用表达式(创建返回消息的函数委托(delegate))而不是使用直接评估:

logger.Debug(() => someObject.GetHeavyDescriptionFromLazyTree());

这有其自身的缺点(委托(delegate)的构造),但它可以比昂贵的方法便宜。通常,您会将其作为重载提供,并且仅在您知道评估表达式的成本很高的情况下才使用它。

关于c# - 记录正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347858/

相关文章:

c# - log4net 第二天启动时覆盖我的日志文件

c# - 进入/退出方法时如何增加/减少缩进?

c# - 什么是最快的 WinForms 控件套件(商业)

c# - 使用 Process.Start() 时将异常冒泡回调用者

c# - 如何避免从构造函数调用长操作

按值调用与按名称调用在 Scala 日志记录库中的性能

python - 将 Python Systemd 输出记录到日志文件

javascript - 登录函数作用域,还有this。 TypeError : custLog(. ..).bind 不是函数

c# - Asp.net 标签不更新

log4net - 如何使用 log4net aspnet-request 转换模式输出所有键和值?