如何在.NET 6 RC1 Minimal API中实现Serilog两阶段配置
.NET 6 RC1 Minimal API Serilog两阶段配置实现方案
两阶段配置的核心是先初始化临时日志配置,记录应用启动过程中的异常和信息,待宿主加载完应用配置后,再替换为正式的日志配置,避免启动阶段配置未加载导致的日志丢失。
前置依赖
先安装所需NuGet包:
Serilog.AspNetCoreSerilog.Sinks.ConsoleSerilog.Sinks.File(需要写入文件日志时安装)
核心实现代码(Program.cs)
using Serilog; // 第一阶段:初始化启动阶段临时日志配置 Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .CreateBootstrapLogger(); try { Log.Information("正在启动.NET 6 RC1 Minimal API服务"); var builder = WebApplication.CreateBuilder(args); // 第二阶段:从应用配置加载正式Serilog配置,替换启动阶段的临时配置 builder.Host.UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration); }); // 此处添加你自己的服务注册逻辑,示例如下 builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 此处添加你自己的中间件配置逻辑,示例如下 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // 注册Serilog请求日志中间件(可选,需要记录请求链路日志时添加) app.UseSerilogRequestLogging(); // 接口示例 app.MapGet("/weatherforecast", () => { Log.Information("访问了天气查询接口"); return Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateTime.Now.AddDays(index), Random.Shared.Next(-20, 55), new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }[Random.Shared.Next(10)] )) .ToArray(); }) .WithName("GetWeatherForecast"); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "服务启动异常,意外终止"); } finally { // 确保所有日志刷入存储介质后再关闭程序 Log.CloseAndFlush(); } internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary) { public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); }
appsettings.json 正式配置示例
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "Microsoft.AspNetCore": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "./logs/log-.txt", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ] }, "AllowedHosts": "*" }
注意事项
- .NET 6 RC1和正式版的Minimal API Serilog配置逻辑完全兼容,不存在版本适配问题,上述代码可直接运行
- 启动阶段的临时日志只会记录服务初始化完成前的日志,宿主构建完成后会自动替换为
appsettings.json中定义的正式配置 - 如果需要过滤启动阶段的冗余日志,可以调整
CreateBootstrapLogger时的最小日志级别,或者对系统命名空间单独配置覆盖规则 - 必须在程序入口最外层包裹try-catch-finally块,确保启动阶段的异常可以被临时日志捕获,且程序退出前所有日志都被刷入存储介质
内容的提问来源于stack exchange,提问作者NSS
相关产品推荐
相关产品推荐

