ILogger依赖注入时无法记录日志,new实例化时正常的问题排查
问题分析与解决方案
核心原因推测
你遇到的问题本质是依赖注入获取的ILogger<Foo>日志被过滤,而手动传入的ILogger<Bar>符合日志输出规则,或者是构造函数选择存在歧义导致注入的日志实例不符合预期。
具体解决步骤
1. 检查日志级别配置
默认情况下,ASP.NET Core的日志系统会根据配置文件过滤日志。如果你的appsettings.json中对Foo类的日志级别设置过高(比如仅允许Error及以上),就会导致LogInformation级别的日志被丢弃,而Bar类的日志级别允许Information,所以手动传入的实例能正常输出。
修改appsettings.json的Logging节点,确保Foo对应的命名空间(或类名)日志级别包含Information:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "YourProjectNamespace.Foo": "Information" // 替换为实际命名空间 } } }
2. 消除构造函数歧义
你的Foo类存在两个构造函数,虽然标记了[ActivatorUtilitiesConstructor],但DI容器在解析IFoo时,可能因构造函数参数类型的歧义(ILogger<Foo> vs 非泛型ILogger)导致注入的日志实例不符合预期。
移除多余的非泛型构造函数,仅保留泛型ILogger<Foo>的构造函数,避免DI容器选择错误:
public class Foo : IFoo { private readonly ILogger<Foo> _logger; public Foo(ILogger<Foo> logger) { _logger = logger; } public void testLog() { _logger.LogInformation("xxxx"); } }
3. 验证日志提供者配置
确保你在项目启动时正确添加了日志提供者(比如Console、Debug),并且没有设置全局过滤规则排除Information级别的日志。
在Program.cs中检查日志配置:
var builder = WebApplication.CreateBuilder(args); // 确保添加了需要的日志提供者,例如Console builder.Logging.AddConsole(); // 设置全局最低日志级别为Information builder.Logging.SetMinimumLevel(LogLevel.Information);
内容的提问来源于stack exchange,提问作者Elias Mezalira
相关产品推荐
相关产品推荐

