我应该如何实现NLOG记录器来减少副本/粘贴乏味



我正在处理一个.NET解决方案,该解决方案将包括MVCWeb API控制器。承认我应该比自己的记录解决方案更好,并且可以从记录框架中的某些功能中受益,我选择了NLog

我一直在寻找有关如何最好地将NLOG添加到此解决方案的建议。对于初学者,让我们面对现实吧,将static Logger logger = LogManager.GetCurrentClassLogger();放在每个班级中都是有点重复的。

到目前为止,我找到了两个解决方案:我的控制器从包含上述一行代码或实现空接口并使用此处提到的扩展方法的基类继承。

如何使所有控制器可用(MVCWeb API)可用,当前的建筑实践说我应该做什么?

MS看起来完全建议您要避免的内容:

public static class ApplicationLogging
{
    public static ILoggerFactory LoggerFactory {get;} = new LoggerFactory();
    public static ILogger CreateLogger<T>() => LoggerFactory.CreateLogger<T>();
}
public class Controller
{
    ILogger Logger { get; } = ApplicationLogging.CreateLogger<Controller>();
}

因此,结果是每个类上的 ILogger属性您希望为其支持Loggging

您可以通过某种基于常规的开发技术添加此类属性,例如,为整个组件创建PostSharp方面,该方面将在其中找到所有需要的类并为其分配记录器。您甚至可以使用Reflection.Emit.PropertyBuilder

飞行创建该属性

还有其他一些解决方案,但是它是否取决于.NET核心或例如。净4.5

我的控制器从包含上述一行的基类继承

建议这将是一种方法,而不是变量,否则,Logger名称适用于所有控制器。

实现一个空接口并使用扩展方法

您可以在Controller类上编写C#扩展。由于控制器为POCO

,这对ASP.NET核心不起作用

另一个选项是使用anotar.nlog.fody:

他们的示例非常自我描述:

您的代码

public class MyClass
{
    void MyMethod()
    { 
        if (LogTo.IsDebugEnabled)
        {
            LogTo.Debug("TheMessage");
        }
    }
}

什么被编译

public class MyClass
{
    static Logger logger = LogManager.GetLogger("MyClass");
    void MyMethod()
    {
        if (logger.IsDebugEnabled)
        {
            logger.Debug("Method: 'Void MyMethod()'. Line: ~12. TheMessage");
        }
    }
}

fody尚未准备好.NET Core

我个人正在使用resharper宏

最新更新