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

自定义DI Logger对象存在意外最低日志级别限制问题咨询

问题原因与解决方案

核心原因

当你通过IServiceProvider.GetRequiredService<ILogger<Program>>获取日志实例时,得到的并非你自定义的bLogger,而是微软日志框架提供的包装类(如Logger<T>)。这个包装类会优先执行全局日志级别过滤,默认最低级别为Information,所以Debug、Trace级别的日志会被直接拦截,根本不会传递到你的bLogger中。

而直接通过ILoggerProvider.CreateLogger创建的实例,是你自定义的bLogger本身,没有经过包装类的级别过滤,因此你的IsEnabled方法会生效,能正常输出Debug日志。

解决方案

方案1:调整全局最低日志级别

在AddLogging配置中设置全局最低级别,让Debug级别的日志通过过滤:

var sp = new ServiceCollection()
            .AddLogging(builder =>
            {
                builder.AddProvider(new bLoggerProvider());
                // 设置全局最低日志级别为Debug,允许Debug及以上级别日志通过
                builder.SetMinimumLevel(LogLevel.Debug);
            })
            .BuildServiceProvider();

方案2:直接注册自定义Logger(不推荐)

如果想完全绕过框架的级别过滤,可以直接将自定义Logger注册到DI容器,但这种方式会丢失日志框架的其他特性(如日志范围、多提供者支持等),仅适合测试场景:

var sp = new ServiceCollection()
            .AddSingleton<ILogger<Program>, bLogger>()
            .BuildServiceProvider();

验证

修改后再次运行代码,logger.LogDebug("This doesn't work")会正常输出内容,因为包装类的级别检查已通过,日志会传递到你的bLogger执行打印逻辑。

内容的提问来源于stack exchange,提问作者Baris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:51:02