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

.NET Core Web API 7中Serilog实现数据库日志失败转存文件的方法

在.NET Core Web API 7中实现Serilog数据库日志失败时转存文件的方案

必要的NuGet包

首先确保安装以下包(根据你的数据库类型调整对应的Sink包):

  • Serilog.AspNetCore:核心Serilog集成包
  • Serilog.Sinks.MSSqlServer(示例用SQL Server,若用其他数据库替换为对应Sink,如Serilog.Sinks.PostgreSQL)
  • Serilog.Sinks.File:文件日志Sink

核心配置实现

在Program.cs中,通过Serilog的WriteTo.Logger包裹数据库Sink,并配置OnFailure回调来处理数据库写入失败的场景,将失败的日志转存到文件:

var builder = WebApplication.CreateBuilder(args);

// 配置Serilog
builder.Host.UseSerilog((context, loggerConfig) =>
{
    // 预先创建兜底用的文件Logger,避免每次失败时重复创建
    var fallbackFileLogger = new LoggerConfiguration()
        .WriteTo.File(
            path: "Logs/fallback-.txt",
            rollingInterval: RollingInterval.Day,
            retainedFileCountLimit: 7,
            outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}")
        .CreateLogger();

    loggerConfig
        .ReadFrom.Configuration(context.Configuration)
        .MinimumLevel.Information()
        // 配置数据库日志Sink,并绑定失败回调
        .WriteTo.Logger(lc => lc
            .WriteTo.MSSqlServer(
                connectionString: context.Configuration.GetConnectionString("LogDb"),
                sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions
                {
                    TableName = "Logs",
                    AutoCreateSqlTable = true
                })
            // 数据库写入失败时触发
            .OnFailure((exception, logEvent) =>
            {
                // 将失败的日志写入文件
                fallbackFileLogger.Write(logEvent);
                fallbackFileLogger.Error(exception, "数据库日志写入失败,已转存到文件");
            })
        );
});

// 常规Web API配置
builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

关键说明

  • 复用兜底Logger:预先创建fallbackFileLogger,避免每次失败时重复初始化Logger,提升性能。
  • 权限与路径:确保Logs目录存在且应用程序有写入权限,避免文件写入也出现失败。
  • 数据库Sink适配:如果使用非SQL Server数据库,替换对应的Sink配置(比如PostgreSQL的WriteTo.PostgreSQL)。
  • 日志模板:可以根据需求调整文件日志的outputTemplate,保证日志信息完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:52:58