从依赖注入容器获取指定日志提供程序:配置UseNLog后仍返回Serilog如何解决
解决方案
问题根因
现有项目中残留的Serilog注册逻辑优先级高于你添加的NLog注册逻辑,导致DI容器最终优先返回Serilog实现的ILogger实例。
调整步骤
- 移除Serilog显式注册代码:检查Program.cs、Startup.cs全局是否存在
UseSerilog()、AddSerilog()这类Serilog注册调用,全部删除。如果是依赖的第三方包隐式注入了Serilog,logging.ClearProviders()会自动清除包括Serilog在内的所有已注册日志Provider。 - 确保NLog注册顺序正确:
UseNLog()必须放在ConfigureLogging配置之后,避免被其他日志配置覆盖,修改后的注册代码如下:
Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); }) .UseNLog();
- 卸载冗余的Serilog包:如果项目不再使用Serilog,直接卸载
Serilog.AspNetCore、Serilog.Extensions.Logging等相关NuGet包,从根源避免自动注册逻辑触发。 - 验证NLog配置有效性:确认项目根目录下的
nlog.config文件属性设置为「如果较新则复制」,配置内容语法符合NLog规范。 - 强制禁用Serilog自动注册(无法卸载Serilog时用):如果因为依赖约束不能卸载Serilog相关包,在项目启动代码最开头添加以下逻辑:
// 关闭并清空已初始化的Serilog静态实例 Serilog.Log.CloseAndFlush(); // 禁用Serilog的自动DI注册逻辑 AppContext.SetSwitch("Serilog.AspNetCore.SuppressUseSerilog", true);
补充说明:默认注入的
ILogger<>是.NET官方日志抽象层的包装实例,只要NLog Provider注册成功,所有日志输出都会遵循NLog的配置规则。如果需要直接获取NLog原生Logger实例,可直接调用静态方法LogManager.GetCurrentClassLogger()获取,无需依赖DI注入。
内容的提问来源于stack exchange,提问作者user2128341
相关产品推荐
相关产品推荐

