NLOG:创建相同 class 的多个实例,将日志写入同一文件
NLOG: Creating multiple instances of same class writing log to same file
我正在努力适应 NLOG,但发现很难为同一 class 的多个实例设置日志文件。每个 class 都是在不同的线程上创建的。请在下面找到示例代码:
{
ILogger mLogger;
public string Name { get; set; }
public string SecondName { get; set; }
private string mFilePath = @"C:\Logs\";
public test(string name, string secondname)
{
var target = new FileTarget(name) { FileName = mFilePath + name + ".txt" };
var config = new LoggingConfiguration();
config.AddRule(LogLevel.Info, LogLevel.Info, target);
LogManager.Configuration = config;
mLogger = LogManager.GetLogger(name);
LogManager.ReconfigExistingLoggers();
mLogger.Info("Hi from :" + name);
}
}
static void Main(string[] args)
{
new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
new Thread(new ThreadStart(() =>
{
new test("John", "Smith");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Virat", "Kohli");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Christiano", "Ronaldo");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Pat", "cummins");
})).Start();
Console.Read();
}
输出为:
2020-03-03 11:36:56.9404|INFO|Christiano|你好,来自:Christiano
2020-03-03 11:36:56.9404|信息|斯图尔特|你好:斯图尔特
2020-03-03 11:36:56.9404|信息|约翰|你好,来自:约翰
2020-03-03 11:36:56.9404|INFO|Virat|您好:Virat
2020-03-03 11:36:56.9404|INFO|Pat|你好来自:Pat
来自一个文件 Christiano.txt
有人可以帮我配置一下吗?
谢谢。
LogManager.Configuration
是一个静态变量。当您分配它时,您会影响其他所有人。
而是为每个线程提供一个唯一的记录器。同一个 FileTarget 可以处理多个 Loggers。
{
ILogger mLogger;
public string Name { get; set; }
public string SecondName { get; set; }
public test(string name, string secondname)
{
mLogger = LogManager.GetLogger(name);
mLogger.Info("Hi from :" + name);
}
}
static void Main(string[] args)
{
string mFilePath = @"C:\Logs\";
var target = new FileTarget(name) { FileName = Path.Combine(mFilePath, "${logger}.txt") };
var config = new LoggingConfiguration();
config.AddRule(LogLevel.Info, LogLevel.Info, target);
LogManager.Configuration = config;
new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
new Thread(new ThreadStart(() =>
{
new test("John", "Smith");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Virat", "Kohli");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Christiano", "Ronaldo");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Pat", "cummins");
})).Start();
Console.Read();
}
或者您可以 assign names to the threads,并在 FileName-Layout 中使用 NLog ${threadname}
而不是 ${logger}
。
另一种替代方法是使用 NLog MappedDiagnosticsLogicalContext.SetScoped("TestName", name) 创建范围并在 FileName-Layout 中使用 ${mdlc:TestName}
。这也将允许您将初始上下文流向异步任务。
我正在努力适应 NLOG,但发现很难为同一 class 的多个实例设置日志文件。每个 class 都是在不同的线程上创建的。请在下面找到示例代码:
{
ILogger mLogger;
public string Name { get; set; }
public string SecondName { get; set; }
private string mFilePath = @"C:\Logs\";
public test(string name, string secondname)
{
var target = new FileTarget(name) { FileName = mFilePath + name + ".txt" };
var config = new LoggingConfiguration();
config.AddRule(LogLevel.Info, LogLevel.Info, target);
LogManager.Configuration = config;
mLogger = LogManager.GetLogger(name);
LogManager.ReconfigExistingLoggers();
mLogger.Info("Hi from :" + name);
}
}
static void Main(string[] args)
{
new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
new Thread(new ThreadStart(() =>
{
new test("John", "Smith");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Virat", "Kohli");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Christiano", "Ronaldo");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Pat", "cummins");
})).Start();
Console.Read();
}
输出为: 2020-03-03 11:36:56.9404|INFO|Christiano|你好,来自:Christiano 2020-03-03 11:36:56.9404|信息|斯图尔特|你好:斯图尔特 2020-03-03 11:36:56.9404|信息|约翰|你好,来自:约翰 2020-03-03 11:36:56.9404|INFO|Virat|您好:Virat 2020-03-03 11:36:56.9404|INFO|Pat|你好来自:Pat
来自一个文件 Christiano.txt
有人可以帮我配置一下吗?
谢谢。
LogManager.Configuration
是一个静态变量。当您分配它时,您会影响其他所有人。
而是为每个线程提供一个唯一的记录器。同一个 FileTarget 可以处理多个 Loggers。
{
ILogger mLogger;
public string Name { get; set; }
public string SecondName { get; set; }
public test(string name, string secondname)
{
mLogger = LogManager.GetLogger(name);
mLogger.Info("Hi from :" + name);
}
}
static void Main(string[] args)
{
string mFilePath = @"C:\Logs\";
var target = new FileTarget(name) { FileName = Path.Combine(mFilePath, "${logger}.txt") };
var config = new LoggingConfiguration();
config.AddRule(LogLevel.Info, LogLevel.Info, target);
LogManager.Configuration = config;
new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
new Thread(new ThreadStart(() =>
{
new test("John", "Smith");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Virat", "Kohli");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Christiano", "Ronaldo");
})).Start();
new Thread(new ThreadStart(() =>
{
new test("Pat", "cummins");
})).Start();
Console.Read();
}
或者您可以 assign names to the threads,并在 FileName-Layout 中使用 NLog ${threadname}
而不是 ${logger}
。
另一种替代方法是使用 NLog MappedDiagnosticsLogicalContext.SetScoped("TestName", name) 创建范围并在 FileName-Layout 中使用 ${mdlc:TestName}
。这也将允许您将初始上下文流向异步任务。