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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:15:08