所以我的问题是关于日志记录,以及如何处理可能影响您的代码和运行时行为的日志语句。正确记录
日志文件...每个程序都应该写出那些用于解决问题的问题,但是如何正确执行?
大多数日志语句是非常昂贵的,因为它们应该提供有用的信息,并且它们总是被建立,即使日志记录被禁用totaly。
可以通过xmls,inCode或某些设置等来配置日志记录,但这不能解决字符串构建问题。
例如,下面的代码总是加载一个巨大的延迟加载的树,在正常执行过程中永远不会被加载totaly。
整个树仅此日志记录语句创建要显示在日志文件中
(好吧,我知道...,但是这仅仅是对所有存在于复杂的记录方法的替代这绝不正常释放执行)期间执行的大多数程序
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);
}
所以我在寻找一个记录解决方案
- 不会过度地通过调试语句来破坏我的源代码
- 其中日志级别是在运行时而不是在编译时确定的
- 其中的语句仅解决,如果neccessary(LOGLEVEL> definedLogLevel)
最佳答案;-)
编辑额外loglines:我正在寻找在.NET 2.0
感谢您的解决方案,这听起来不错,但我forgott,它必须与.NET 2.0解决:-( – oberfreak
@oberfreak,在这种情况下,我认为标准的'如果'检查是你最好的选择;希望你 –
为什么这个问题不适用于.NET 2.0?我一直以VS.NET 2010和.NET 2.0作为目标平台来做这件事 –