我的主要类正在运行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");
,然后来自先前启动的线程的所有日志都出现在那里。
我不知道在运行时有多少不同的目标。
答案 0 :(得分:0)
NLog仅支持ONE LoggingConfiguration
,因此您必须在运行时修改现有的。
可以在这里找到一种可能的解决方案:
C# lock issues when writing to log
如果使用NLog 4.5,那么你可以在FileTarget-filename中使用${logger}
。然后,您不需要将配置修改为运行时,而只需创建具有所需名称的新记录器。