在不同类中通过依赖注入(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
相关产品推荐
相关产品推荐

