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

.NET 6控制台程序Host崩溃时如何通过Serilog捕获记录异常

.NET 6 控制台集成Serilog时捕获Host运行崩溃异常的实现方式

当你通过UseSerilog()完成日志组件配置后,Serilog会自动将按配置初始化的日志实例赋值给全局静态对象Log.Logger,无需从DI容器额外解析,在try/catch块中直接调用静态日志接口即可完成异常记录。

注意:必须在程序退出前执行日志刷盘操作,否则崩溃时内存中缓冲的日志可能无法写入目标存储,导致日志丢失。

修正后的完整实现代码

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;

// 最佳实践:提前初始化启动日志器,捕获Host构建阶段的异常
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddEnvironmentVariables()
        .Build())
    .CreateBootstrapLogger();

try
{
    IHost host = Host.CreateDefaultBuilder(args)
        .UseSerilog((ctx, lc) => lc
            .ReadFrom.Configuration(ctx.Configuration))
        .ConfigureServices((context, services) =>
        {
            services.AddHostedService<Worker>();
        })
        .Build();

    await host.RunAsync();
}
catch (Exception ex)
{
    // 直接调用全局静态Serilog实例记录致命级别的异常
    Log.Fatal(ex, "Host运行出现未处理的致命异常,程序终止");
    throw;
}
finally
{
    // 无论正常/异常退出,都强制刷写所有缓冲日志,避免日志丢失
    Log.CloseAndFlush();
}

关键注意事项

  • 不要在catch块中尝试通过host.Services解析ILogger实例:如果异常发生在Host构建、DI容器初始化阶段,服务解析操作会抛出二次异常,覆盖原始错误信息,直接使用全局静态Log.Logger是最稳妥的方案。
  • 提前初始化CreateBootstrapLogger()是可选但强烈推荐的配置:原写法中Serilog的初始化依赖Host构建完成,如果host.Build()阶段就抛出异常(比如配置文件格式错误、服务注册依赖缺失),此时全局Logger还未完成配置,无法记录构建阶段的错误,启动日志器会在Host初始化完成后被正式配置的Logger自动替换,不会产生冲突。
  • 崩溃类异常建议使用Log.Fatal级别记录,和普通运行错误做区分,方便后续排查问题。

内容的提问来源于stack exchange,提问作者Kiran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:54:44