.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
相关产品推荐
相关产品推荐

