Nlog日志级别规则未更改

时间:2019-09-10 18:24:40

标签: c# nlog

例如,该类以编程方式初始化NLog配置:

scoreFunction

现在,我在两个不同的类中调用此配置,例如:

public class NLogConfig
{
    public NLogConfiguration(string traceFileName, LogLevel minLogleven, LogLevel maxLogLevel)
    {
        var config = new NLog.Config.LoggingConfiguration();

        // Targets where to log to file
        var logfile = new NLog.Targets.FileTarget("logfile") { FileName = $"{traceFileName}.log" };
        logfile.Layout = @"${date:format=HH\:mm\:ss}|${level}|${message} ${exception:format=tostring}";

        // Rules for mapping loggers to targets            
        config.AddRule(minLogleven, maxLogLevel, logfile);

        // Apply config           
        LogManager.Configuration = config;
    }

}

现在的问题是,Nlog配置不会采用两个不同的日志级别规则,因此在这种情况下,public class A { public A() { var nlogConfig = new NLogConfig("Trace1", LogLevel.Trace, LogLevel.Fatal); } } public class B { public B() { var nlogConfig = new NLogConfig("Trace2", LogLevel.Info, LogLevel.Fatal); } } Trace1.log日志都与Trace2.log一起使用级别,而我希望trace的日志级别为Trace1.log,而Trace的日志级别为Trace2.log

如何解决此问题,因此,我可以动态更改日志级别?

1 个答案:

答案 0 :(得分:1)

在一开始,我将尝试概述您的应用程序的总体设计,然后才为您提供代码示例。

设计概述。

我们[开发人员]喜欢使事情尽可能简单。实现此目的的方法之一是分离软件模块的职责。 在您的情况下,类A(或B)不应在意目标文件名是什么或日志级别。它应该只记录记录,仅此而已! 但是您可以问如何用不同的设置写入不同的文件?为此,您应该使用“目标”和“规则”概念。基本上,目标只是日志目标。它可以是文件,控制台等。规则是过滤器,仅选择您需要的消息。它可以只是一个日志级别,也可以是按类名的特殊过滤器,也可以是更多的方法。实际上,您在第一个示例中显示的配置是目标和规则的设置。 这种设计应有助于分离和简化事物。我希望您了解我在说什么,否则,您需要在100个使用记录器的类的项目中更改记录设置时,想象一下模拟。

可能的解决方案。

A类和B类应该创建日志实例并使用它。

public class A
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
    public A()
    {
        Logger.Info("Class 'A' created.");
    }
}

通常在应用程序启动时进行Nlog配置,以在应用程序生存期内仅执行一次。

public static class Program
{
    public static void Main()
    { 
        LogConfiguration();
    }
    private static void LogConfiguration()
    {
       var config = new LoggingConfiguration()

       // Targets where to log to: File and Console
       var f1 = new FileTarget("file1") { FileName = "file1.txt" };
       var f2 = new FileTarget("file2") { FileName = "file2.txt" };

       // Rules for mapping loggers to targets            
       config.AddRule(LogLevel.Info, LogLevel.Fatal, f1);
       config.AddRule(LogLevel.Debug, LogLevel.Fatal, f2);

       // Apply config           
       NLog.LogManager.Configuration = config;
    }
}

可能的功能

从您的代码看来,您可能只想将来自类B的消息写入“ file2.txt”。这也是可能的。您需要在创建规则期间指定记录器名称,如下所示。小提示:您要使用的名称是全班级的名称。 从this的示例中,您将了解我在说什么。