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

在不同类中通过依赖注入(DI)使用配置好的LoggerFactory

结合依赖注入使用配置好的LoggerFactory

在.NET中,不需要手动创建LoggerFactory再注册到DI容器,而是通过AddLogging扩展方法完成日志配置与DI的绑定,DI会自动管理LoggerFactory和ILogger实例的生命周期。以下是不同场景的实现示例:

一、控制台应用(无Host)场景

1. 配置DI容器与日志

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;

// 加载配置文件(可选,若需结合appsettings.json)
var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .Build();

// 创建服务容器
var services = new ServiceCollection();

// 配置日志规则,与你手动创建LoggerFactory的逻辑完全一致
services.AddLogging(builder =>
{
    builder
        .AddFilter("Microsoft", LogLevel.Warning)
        .AddFilter("System", LogLevel.Warning)
        .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
        .AddConsole();
    
    // 结合配置文件的日志设置(可选)
    builder.AddConfiguration(configuration.GetSection("Logging"));
});

// 注册需要注入日志的业务类
services.AddTransient<MyBusinessService>();

// 构建服务提供者
using var serviceProvider = services.BuildServiceProvider();

// 获取业务类实例,日志已自动注入
var service = serviceProvider.GetRequiredService<MyBusinessService>();
service.ExecuteTask();

2. 业务类中注入ILogger

public class MyBusinessService
{
    // 推荐注入ILogger<T>,自动以类名作为日志类别
    private readonly ILogger<MyBusinessService> _logger;

    public MyBusinessService(ILogger<MyBusinessService> logger)
    {
        _logger = logger;
    }

    public void ExecuteTask()
    {
        _logger.LogDebug("开始执行任务:{TaskName}", "数据同步");
        _logger.LogInformation("任务执行完成");
    }
}

二、ASP.NET Core应用场景

ASP.NET Core默认使用WebApplicationBuilder管理DI和日志,只需在Program.cs中扩展日志配置即可:

var builder = WebApplication.CreateBuilder(args);

// 配置日志规则
builder.Logging
    .AddFilter("Microsoft", LogLevel.Warning)
    .AddFilter("System", LogLevel.Warning)
    .AddFilter("MyAspNetApp", LogLevel.Debug)
    .AddConsole();

// 注册业务类
builder.Services.AddScoped<MyBusinessService>();

var app = builder.Build();

// 其他中间件配置...

app.Run();

业务类的注入方式与控制台场景完全一致,直接在构造函数中声明ILogger<T>即可。

三、直接注入LoggerFactory(特殊场景)

如果确实需要在类中直接使用LoggerFactory(比如创建自定义类别的日志),DI容器已自动注册了它,直接注入即可:

public class CustomLoggingService
{
    private readonly ILoggerFactory _loggerFactory;

    public CustomLoggingService(ILoggerFactory loggerFactory)
    {
        _loggerFactory = loggerFactory;
    }

    public void LogCustomMessage()
    {
        var customLogger = _loggerFactory.CreateLogger("CustomCategory");
        customLogger.LogWarning("自定义类别的警告日志");
    }
}

关键注意事项

  • 优先使用ILogger<T>注入:自动绑定类名作为日志类别,便于定位日志来源
  • 配置优先级:代码中设置的过滤器优先级高于配置文件,若需以配置文件为准,可调整配置顺序或调用builder.ClearProviders()后重新添加
  • 生命周期:LoggerFactory在DI中以单例模式注册,ILogger<T>同样是单例,无需担心重复创建实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:34:58