c# - NLog多实例,如何?

标签 c# nlog

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

我发现每次定义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 类的多实例。
谢谢

最佳答案

一个简单的选择是在文件名中使用 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
    }

关于c# - NLog多实例,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40542261/

相关文章:

c# - 类(class);结构;枚举困惑,什么更好?

c# - 最近的 Twitter API 1.1 的 Twitterizer 版本

c# - Azure Cosmos 数据库引发套接字异常

NLog 邮件目标不起作用

c# - 为 nlog : Error when setting property 'Layout' on NLog. Targets.DatabaseParameterInfo 创建配置节处理程序时出错

c# - 如何根据浏览器在同一页面上嵌入 32 位或 64 位 ActiveX 控件?

c# - 无法确定导航属性 EF Core 表示的关系

c# - Nlog 使用 DI 和 appsettings.json 记录到数据库 .NET 5.0

asp.net - 对于在 Azure Web App 上运行的任何自定义目标,NLog 都会抛出 'Target cannot be found'

c# - Nlog 根据变量保存日志文件