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

如何在.NET 6 RC1 Minimal API中实现Serilog两阶段配置

.NET 6 RC1 Minimal API Serilog两阶段配置实现方案

两阶段配置的核心是先初始化临时日志配置,记录应用启动过程中的异常和信息,待宿主加载完应用配置后,再替换为正式的日志配置,避免启动阶段配置未加载导致的日志丢失。

前置依赖

先安装所需NuGet包:

  • Serilog.AspNetCore
  • Serilog.Sinks.Console
  • Serilog.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:15:01