如何在.NET 6控制台应用Serilog配置中消除IConfiguration冗余
.NET 6控制台应用消除Serilog配置冗余的方案
方案一:复用Host构建流程中的配置实例
无需提前单独创建IConfiguration变量,直接在Host构建链中复用已生成的配置:
using Microsoft.Extensions.Hosting; using Serilog; var host = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, configBuilder) => { // 在这里添加自定义配置源,比如额外的JSON文件、环境变量等 configBuilder.AddJsonFile("serilog-custom.json", optional: true, reloadOnChange: true); }) .UseSerilog((context, loggerConfig) => { // 通过HostBuilderContext直接获取已构建好的配置,无需提前实例化 loggerConfig.ReadFrom.Configuration(context.Configuration); }) .ConfigureServices((context, services) => { // 服务配置环节同样可以复用该配置实例 services.Configure<ServiceSettings>(context.Configuration.GetSection("ServiceSettings")); services.AddScoped<IMyService, MyService>(); }) .Build(); await host.RunAsync();
方案二:简化版配置复用(默认配置源场景)
如果Serilog配置直接放在默认配置文件(如appsettings.json)中,可进一步简化代码:
using Microsoft.Extensions.Hosting; using Serilog; var host = Host.CreateDefaultBuilder(args) .UseSerilog((hostingContext, loggerConfig) => { loggerConfig .ReadFrom.Configuration(hostingContext.Configuration) .Enrich.FromLogContext(); }) .ConfigureServices(services => { services.AddScoped<IMyService, MyService>(); }) .Build(); await host.RunAsync();
关键说明
- 核心逻辑:
UseSerilog的重载方法提供HostBuilderContext参数,该上下文已包含ConfigureAppConfiguration环节构建完成的IConfiguration实例,彻底避免配置重复创建。 - 这种方式让Serilog与其他服务共享同一套配置源,保证配置的一致性。
- 若需扩展配置源,仅需在
ConfigureAppConfiguration中添加,后续所有环节(Serilog、服务配置等)均可直接复用。
内容的提问来源于stack exchange,提问作者user19187727
相关产品推荐
相关产品推荐

