NLog多实例,怎么样?

时间:2016-11-11 06:22:32

标签: c# nlog

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

我发现每次我以不同方式定义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
        }

所有输出都写在&#39; 9.txt&#39;!
中 如何使用NLog Class的多个实例 感谢

1 个答案:

答案 0 :(得分:1)

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

for (auto it = numbers.begin(); it < numbers.end(); it ++)
    cout << (*it) << "\t";

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

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