You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从依赖注入容器获取指定日志提供程序:配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:06:03