NLog C#在运行时配置不同的日志文件

时间:2018-02-02 11:05:37

标签: c# logging nlog

我的主要类正在运行10个并发线程,我希望将每个线程的输出放在一个单独的文件中。我希望将一些线程分组到同一个文件中。为此,我编写了下面的类,它可以动态生成LoggingConfiguration。我想生成不同的Logger个对象,每个对象都有自己的特定LoggingConfiguration

以下是我的配置生成方法:

private LoggingConfiguration GetLoggerConfig(string target)
    {
        if (!Directory.Exists(target)){
            Directory.CreateDirectory(target);
        }
        // Step 1. Create configuration object 
        var config = new LoggingConfiguration();

        // Step 2. Create targets and add them to the configuration 
        var consoleTarget = new ColoredConsoleTarget();
        config.AddTarget("console", consoleTarget);

        var fileTarget = new FileTarget();
        config.AddTarget("file", fileTarget);

        var asyncWrapper = new AsyncTargetWrapper();
        asyncWrapper.QueueLimit = 5000;
        asyncWrapper.OverflowAction = AsyncTargetWrapperOverflowAction.Grow;
        asyncWrapper.WrappedTarget = fileTarget;

        // Step 3. Set target properties 
        consoleTarget.Layout = @"${longdate} | ${logger} |  ${level} | ${message}";//@"${date:format=HH\:mm\:ss} ${logger} ${message}";
        fileTarget.FileName = Path.Combine(target, "logs-${shortdate}.txt");
        fileTarget.Layout = "${longdate} | ${machinename} | ${processid} | ${processname} | ${logger} | ${level} | ${message}";

        // Step 4. Define rules
        config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, consoleTarget));
        config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, asyncWrapper));


        return config;
    }

我正试图让我的语法看起来像这样:

Logger logger1 = GetLoggerConfig(@"C:\Target1");
Logger logger2 = GetLoggerConfig(@"C:\Target2");

logger1.Info("hello -- should be printed in a file");
logger2.Info("World -- should be printed in a different file");

相反,我所拥有的是:在每个线程中,我调用LogManager.Configuration = GetLoggerConfig(@"C:\Target1");,然后来自先前启动的线程的所有日志都出现在那里。

我不知道在运行时有多少不同的目标。

1 个答案:

答案 0 :(得分:0)

NLog仅支持ONE LoggingConfiguration,因此您必须在运行时修改现有的。

可以在这里找到一种可能的解决方案:

C# lock issues when writing to log

如果使用NLog 4.5,那么你可以在FileTarget-filename中使用${logger}。然后,您不需要将配置修改为运行时,而只需创建具有所需名称的新记录器。