.NET 5 Web API配置Serilog写入SQL Server日志失败排查
Serilog 写入数据库Log表无数据排查项
- 检查应用启动初始化逻辑:必须在
Main方法最顶部、创建Host之前完成Serilog全局实例初始化,且应用退出时必须调用Log.CloseAndFlush()强制刷新缓冲区日志,否则进程退出时缓冲区里未写入的日志会直接丢失。标准初始化代码结构如下:
public static void Main(string[] args) { // 提前加载配置文件 var config = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(config) .CreateLogger(); try { CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "应用启动异常终止"); } finally { // 这行必须加,否则日志可能滞留在缓冲区不写入 Log.CloseAndFlush(); } }
- 检查NuGet包引用完整性:根据你使用的数据库安装对应依赖,核心包不能缺:
- 基础依赖:
Serilog.AspNetCore、Serilog.Settings.Configuration - 数据库Sink:SQLServer装
Serilog.Sinks.MSSqlServer,PostgreSQL装Serilog.Sinks.PostgreSQL,MySQL装Serilog.Sinks.MySQL
- 基础依赖:
- 检查配置文件格式与有效性:
- Serilog配置节点必须放在
appsettings.json根层级,不能嵌套在其他配置节点下 - 配置的日志最低级别不能高于你实际写入的日志级别,比如要写入Information级别日志,
MinimumLevel不能设置为Warning/Error/Fatal - 连接字符串必须有目标数据库的写权限,可以单独用数据库客户端拿该连接串测试连通性和表写入权限,自定义表名的话要和实际数据库中的Log表名完全一致
参考配置示例:
- Serilog配置节点必须放在
{ "Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "Name": "MSSqlServer", "Args": { "connectionString": "你的数据库连接字符串", "tableName": "Logs", "autoCreateSqlTable": false } } ], "Override": { "Microsoft": "Warning", "System": "Warning" } } }
- 检查日志过滤规则:如果配置了
Override节点的命名空间级别过滤,确认你写日志的类所在命名空间没有被设置过高的日志过滤级别,否则对应命名空间下的低级别日志会被直接丢弃。 - 开启Serilog自诊断定位隐藏错误:Serilog默认会吞掉Sink写入过程中的异常,不会直接抛出,你可以在初始化Logger之前开启SelfLog,输出Sink内部的报错信息定位具体问题:
// 把自诊断日志输出到调试输出窗口 Serilog.Debugging.SelfLog.Enable(msg => System.Diagnostics.Debug.WriteLine(msg)); // 部署环境可以输出到控制台错误流或者指定本地文件
部署场景额外注意:如果是IIS部署,要确认应用程序池对应的运行身份有目标数据库的写入权限;如果是容器部署,要确认容器能正常连通数据库端口,没有被网络策略拦截。
内容的提问来源于stack exchange,提问作者Nilesh
相关产品推荐
相关产品推荐

