我应该如何实施Nlog记录器来减少复制/粘贴乏味?

时间:2017-02-23 18:13:33

标签: asp.net-mvc asp.net-web-api .net-4.5 nlog

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

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

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

如何让记录器对所有控制器(MVCWeb API)可用,以及当前的架构实践说我应该做些什么?

2 个答案:

答案 0 :(得分:0)

还有一些其他解决方案,但如果它在.NET Core上,或者例如NET 4.5

  

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

建议这是一个方法而不是变量,否则记录器名称对于所有控制器都是相同的。

  

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

您可以在Controller课程上编写c#扩展名。这不适用于ASP.NET Core,因为控制器是POCO

另一种选择是使用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是not ready yet for .NET Core

就我个人而言,我正在使用Resharper宏

答案 1 :(得分:0)

看起来像MS suggests exactly what you're trying to avoid

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属性

您可以通过某种基于约定的开发技术添加此类属性,例如,创建一个PostSharp aspect for a whole assembly,它将在其中找到所有需要的类并为其分配记录器。您甚至可以使用Reflection.Emit.PropertyBuilder

在飞行中创建该属性