NLog多实例,如何?
NLog multi instance, How?
我有一个多线程应用程序,希望每个线程都有单独的 NLog Config(dest, format)。
我需要将每个线程数据记录到不同的文件中,因此需要在代码中进行配置(分隔 dest/filename/message 格式)。
我发现每次定义LoggingConfiguration
都不一样,赋值LogManager.Configuration
然后得到
GetLogger()
它覆盖最后一个配置和 return 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 的多实例 Class.
谢谢
一个简单的选择是在文件名中使用 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
}
我有一个多线程应用程序,希望每个线程都有单独的 NLog Config(dest, format)。
我需要将每个线程数据记录到不同的文件中,因此需要在代码中进行配置(分隔 dest/filename/message 格式)。
我发现每次定义LoggingConfiguration
都不一样,赋值LogManager.Configuration
然后得到
GetLogger()
它覆盖最后一个配置和 return 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 的多实例 Class.
谢谢
一个简单的选择是在文件名中使用 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
}