【问题标题】:NLog multi instance, How?NLog 多实例,如何?
【发布时间】:2016-11-11 06:22:32
【问题描述】:

我有一个多线程应用程序,并希望每个线程都有单独的 NLog Config(dest, format)。
我需要将每个线程数据记录到不同的文件中,因此需要在代码中进行配置(分隔的 dest/filename/message 格式)。

我发现每次我定义LoggingConfiguration的时候都不同,并赋值LogManager.Configuration然后得到 GetLogger() 它覆盖最后一个配置并返回 Logger 的单个实例,因此只创建一个输出。

似乎我不能在 NLog 中拥有多个 Logger 实例!!!
为了测试我写了下面的测试代码。

        List<Logger> Loggers = new List<Logger>();
        for (int i = 0; i < 10; i++)
        {
            var config = new LoggingConfiguration();

            var fileTarget = new FileTarget();
            config.AddTarget("file", fileTarget);
            fileTarget.Layout = "${message}";
            fileTarget.CreateDirs = true;
            fileTarget.FileName = Convert.ToString(i)+".txt";
            fileTarget.FileAttributes = Win32FileAttributes.ReadOnly | Win32FileAttributes.WriteThrough;
            fileTarget.LineEnding = LineEndingMode.CRLF;
            var rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget);
            config.LoggingRules.Add(rule2);

            LogManager.Configuration = config;   // overwrite last config

            Loggers.Add(LogManager.GetLogger(Convert.ToString(i)));   

        }

        for (int i = 0; i < 10; i++)
        {
            Loggers[i].Info("text "+ Convert.ToString(i));  // all written in single output
        }

所有输出都写在“9.txt”中!
NLog 类的多实例。
谢谢

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    一个简单的选择是在文件名中使用 threadid,例如

    fileTarget.FileName = "thread-${threadid}.txt";
    

    您也可以创建多个目标,但不要创建新配置,例如这有点不常见,也不是首选。

        List<Logger> Loggers = new List<Logger>();
        for (int i = 0; i < 10; i++)
        {
            //no new here, but change the current
            var config = LogManager.Configuration;
    
            var fileTarget = new FileTarget();
            config.AddTarget("file"+i, fileTarget); //unique name here
            fileTarget.Layout = "${message}";
            fileTarget.CreateDirs = true;
            fileTarget.FileName = Convert.ToString(i)+".txt";
            fileTarget.FileAttributes = Win32FileAttributes.ReadOnly | Win32FileAttributes.WriteThrough;
            fileTarget.LineEnding = LineEndingMode.CRLF;
            var rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget);
            config.LoggingRules.Add(rule2);
    
            LogManager.Configuration = config;   //update config
    
            Loggers.Add(LogManager.GetLogger(Convert.ToString(i)));   
    
        }
    
        for (int i = 0; i < 10; i++)
        {
            Loggers[i].Info("text "+ Convert.ToString(i));  // all written in single output
        }
    

    【讨论】:

    • 嗨,这个解决方案有效吗?我似乎发现它将所有内容都写入每个文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多