WebApplicationBuilder与IHostBuilder的Logger获取差异及提前获取方法
ASP.NET Core WebApplicationBuilder与Worker Service IHostBuilder日志获取差异及解决方案
一、两种构建器的差异原因
- WebApplicationBuilder:是ASP.NET Core 6+推出的简化构建器,它的
Logging属性直接暴露了底层服务集合(Services),且内部已预先初始化基础日志服务框架。配置日志后,可直接通过BuildServiceProvider()临时构建服务提供者,获取到已配置好的Logger——这里的临时服务提供者虽与最终应用的服务容器不是同一个,但日志配置已同步到服务集合,因此能得到符合预期的Logger。 - IHostBuilder:设计核心是「延迟构建」,所有服务配置(包括日志)都通过回调函数注册,这些配置只会在
Build()阶段才会被合并到最终服务容器中。IHostBuilder封装了内部服务配置逻辑,未暴露可提前构建的服务集合入口,因此必须等待Build()完成后才能获取完整的服务提供者与Logger。
二、Worker Service中ConfigureLogging后立即获取Logger的方案
方案1:手动构建临时服务容器
手动创建独立的服务集合配置日志,提前获取Logger,之后将相同配置同步到IHostBuilder:
// 构建临时服务容器并配置日志 var tempServices = new ServiceCollection(); tempServices.AddLogging(x => { x.ClearProviders(); x.AddLog4Net(); }); using var tempProvider = tempServices.BuildServiceProvider(); var logger = tempProvider.GetRequiredService<ILoggerFactory>().CreateLogger<MyType>(); // 将日志配置同步到IHostBuilder _builder.ConfigureLogging(x => { x.ClearProviders(); x.AddLog4Net(); }); // 此时logger已可用于提前日志输出 logger.LogInformation("提前获取的Logger开始工作");
注意:需保证临时配置与最终Host的日志配置完全一致,避免日志行为出现差异。
方案2:通过ConfigureServices临时构建服务提供者
利用IHostBuilder的ConfigureServices直接操作服务集合,配置日志后临时构建服务提供者获取Logger:
ILogger<MyType> logger = null; _builder.ConfigureServices(services => { // 向Host服务集合添加日志配置 services.AddLogging(x => { x.ClearProviders(); x.AddLog4Net(); }); // 临时构建服务提供者获取Logger using var tempProvider = services.BuildServiceProvider(); logger = tempProvider.GetRequiredService<ILoggerFactory>().CreateLogger<MyType>(); }); // 提前使用Logger logger?.LogInformation("已通过临时服务提供者获取Logger"); // 正常构建Host var host = _builder.Build();
注意:临时构建的服务提供者与最终Host的服务容器是不同实例,仅用于提前获取Logger,不要用它获取需长期运行的服务。
内容的提问来源于stack exchange,提问作者Stig
相关产品推荐
相关产品推荐

