所以我的问题是关于日志记录,以及如何处理可能影响您的代码和运行时行为的日志语句。
日志文件...每个程序都应编写这些文件以正确解决问题,但如何正确执行?
大多数日志语句的获取成本都非常高,因为它们应该提供有用的信息,而且即使完全禁用日志记录,它们也会始终构建。
日志记录可以通过 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/