gpt4 book ai didi

c# - 记录正确

转载 作者:太空狗 更新时间:2023-10-29 18:27:47 25 4
gpt4 key购买 nike

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

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

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

日志记录可以通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com