自定义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
相关产品推荐
相关产品推荐

