gpt4 book ai didi

asp.net-mvc - 我的日志框架永远与我的应用程序绑定(bind)在一起!

转载 作者:行者123 更新时间:2023-12-02 04:10:13 36 4
gpt4 key购买 nike

好的,所以我正在研究 NLog。根据使用情况,我的应用程序将与日志记录框架绑定(bind)。我该如何克服这个问题?

此外,当使用 NLog 时,我必须为使用此框架的每个类编写太多的 monkey-code 。创建一个静态类并从应用程序中的任何位置访问它是一种好习惯吗?

示例:

//the monkey code
private static Logger logger = LogManager.GetCurrentClassLogger();

//the coupling.
logger.Log(/*...*/);

最佳答案

  1. 创建您自己的日志记录界面:

    public interface IMyOwnLogger {
    void Log(string message);
    }
  2. 创建实现:

    public class NLogLogger : IMyOwnLogger {
    void Log(string message) {
    StackFrame frame = new StackFrame(1, false);
    Logger logger = LogManager.GetLogger(frame.GetMethod().DeclaringType.FullName);
    logger.Log(/*...*/);
    }
    }
  3. 将 IMyOwnLogger 绑定(bind)到 IOC 容器中的 NLogLogger。

  4. 在需要的地方注入(inject)(或使用 IOC.Get<IMyOwnLogger>() )。

编辑:

Idsa 发表了关于失去调用级别的评论。请记住,您始终可以使用堆栈跟踪:

var method = (new StackTrace()).GetFrame(1).GetMethod()

并从那里提取调用类。

编辑:

这就是GetCurrentClassLogger在 NLog 中看起来像这样,因此在我们的类中使用 StackTrace 不会产生额外的开销:

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
#if SILVERLIGHT
StackFrame frame = new StackTrace().GetFrame(1);
#else
StackFrame frame = new StackFrame(1, false);
#endif

return globalFactory.GetLogger(frame.GetMethod().DeclaringType.FullName);
}

关于asp.net-mvc - 我的日志框架永远与我的应用程序绑定(bind)在一起!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4982547/

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