2017-02-23 62 views
2

我正在研究.NET解决方案,其中包括MVCWeb API控制器。在承认我应该比自己的日志记录解决方案更好,并且可以从日志框架中的某些功能中受益后,我选择了NLog我应该如何实现Nlog记录器来减少复制/粘贴的乏味?

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

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

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

回答

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>(); 
} 

的结果,因此,为每个要为其类的​​财产支持日志记录

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

0

还有一些其他的解决方案,但它依赖于如果这是在.NET核心或例如NET 4.5

我控制器从包含上述一行

它的建议,这将是一个方法,而不是变量的基类继承,否则记录器名称是所有控制器相同。

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

你可以写上Controller类C#的扩展。这不会对ASP.NET核心工作作为控制器是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的宏

相关问题