我通过依赖注入设置了 NLog,其中一个地方,我注入记录器的地方是我的主类。Application
在这个类中,我创建了我的Socket服务器的实例,在这里我有接受连接或错误等事件... ... 这些事件被设置在 Application
.
例如: OnAccept
事件当然是由另一个线程处理的,那里正在运行监听连接。当这个事件被调用时,所有的事情都如其所愿,但日志器并没有在日志中写任何东西。如果我用 Console.WriteLine()
它写下了所有的东西,所以这个事件被正确地调用了(甚至通过调试检查)。
它是NLog中的东西ILogger<>
它不能从另一个线程写入日志?在这种情况下如何使用它?
所以,问题其实是隐藏的,我是用DI与创建多个scopes,所以通过这种方式创建是不行的。
var serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder =>
{
builder.ClearProviders();
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddNLog($"{ConfigBasePath}/{NlogConfig}");
});
有两种解决方案,创建一个共享的 NLogFactory,而不是为每个 DI 容器创建,使用静态 LogManager 设置配置文件。或者通过这段代码创建多个隔离的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.