所以我的问题是关于日志记录,以及如何处理可能对您的代码和运行时行为产生影响的日志语句。
日志文件...每个程序都应该编写这些文件以进行适当的问题解决,但如何正确地执行此操作?
大多数日志语句很难获取,因为它们应该提供有用的信息,并且即使完全禁用日志记录,它们也总是被构建。
日志记录可以通过xml、inCode或某些设置进行配置,但这并不能解决字符串构建问题。
例如,以下代码总是加载一个巨大的延迟加载树,在正常执行期间永远不会完全加载。
整个树仅为了显示在日志文件中而创建
(好吧,我知道...,但这只是替换了大多数程序中存在的复杂日志记录方法,在正常发布执行期间不应执行)
我认为很明显,#if DEBUG编译器标记不是用于生产代码的解决方案。如果我使用logger.DoLogDebug()将会存在过多的检查代码,以判断是否启用日志记录... 因此这也不能成为解决方案。我认为ConditionalAttribute可以帮助解决问题,但它也受到编译器标记的限制,并且无法禁用对GetHeavyDescriptionFromLazyTree的调用。
日志文件...每个程序都应该编写这些文件以进行适当的问题解决,但如何正确地执行此操作?
大多数日志语句很难获取,因为它们应该提供有用的信息,并且即使完全禁用日志记录,它们也总是被构建。
日志记录可以通过xml、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可以帮助解决问题,但它也受到编译器标记的限制,并且无法禁用对GetHeavyDescriptionFromLazyTree的调用。
[Conditional("DEBUG")]
public void Debug(string debugMessage)
{
Console.WriteLine(debugMessage);
}
因此,我正在寻找一种日志记录解决方案,它具有以下特点:
- 不会使用调试语句过度破坏我的源代码
- 日志级别在运行时而不是编译时决定
- 仅在必要时解析语句(logLevel> definedLogLevel)
最佳答案将提供额外的日志行;-)
编辑:我正在寻找.NET 2.0中的解决方案。