我已经通过依赖项注入设置了NLog,在一个地方,我将记录器注入的地方是我的主要类Application
,在该类中,我创建了Socket Server的实例,其中发生了关于Accept connection或error等事件。 on ...这些事件在Application
中设置。
例如,OnAccept
事件当然是由另一个线程处理的,其中正在监听连接。调用此事件后,一切都会按预期进行,但是记录器不会在日志中写入任何内容。如果我使用的不是记录器Console.WriteLine()
,它会写入所有内容,因此将正确调用此事件(甚至通过调试检查)。
这是NLog / ILogger<>
中的某个内容,它无法从另一个线程写入日志?以及在这种情况下如何使用它?
所以,这个问题实际上是隐藏的,我在使用DI创建多个作用域,所以通过这种方式创建是行不通的:
var serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder =>
{
builder.ClearProviders();
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddNLog($"{ConfigBasePath}/{NlogConfig}");
});
有两种解决方案,使用静态LogManager设置配置文件,创建一个共享的NLogFactory,而不是为每个DI容器创建而创建。或通过以下代码创建多个隔离的LogFactory:
var serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder =>
{
builder.ClearProviders();
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddNLog(serviceProvider => {
var logFactory = new NLog.LogFactory();
logFactory.LoadConfiguration($"{ConfigBasePath}/{NlogConfig}");
return logFactory;
});
});
我在NLog GitHub上的问题。