经典ASP.NET(非Core)使用Serilog写SQL Server日志无记录问题
Serilog MSSQL Sink 写入SQL Server失败排查方案
以下是针对ASP.NET Framework项目下该问题的可落地排查步骤:
1. 补全基础配置,排除配置缺失问题
首先修正Logger初始化代码,显式指定日志级别、提交规则,同时加控制台输出确认日志正常被采集:
// 先开启Serilog内部日志,输出所有自身报错,直接定位写入失败原因 Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine($"Serilog内部错误:{msg}")); Log.Logger = new LoggerConfiguration() // 显式指定全局最低采集级别,Debug及以上级别都会被采集 .MinimumLevel.Debug() .WriteTo .MSSqlServer( connectionString: "Server=DESKTOP-A9EBI4L;Database=SvuCommon_Alternate;Integrated Security=SSPI;", sinkOptions: new MSSqlServerSinkOptions { TableName = "EventLog", // 测试阶段可设置为1,每条日志立即提交,避免批次缓存导致看不到数据 BatchPostingLimit = 1, // 如果不需要自己建表,开启后会自动创建符合要求的EventLog表 // AutoCreateTable = true }) // 加控制台输出,先确认日志被Serilog正常采集,排除上层采集问题 .WriteTo.Console() .CreateLogger(); // 测试日志 Log.Information("{Message}","sdfs" ); try { int a = 1, b = 0; Log.Debug("The value are {0} and {1}", a, b); } catch (Exception ex) { Log.Error(ex, "some Error!"); } // 注意:如果是Web项目不要在初始化后就调用CloseAndFlush,需要放到Global.asax的Application_End方法中执行 Log.CloseAndFlush(); Console.Out.WriteLine("Done");
2. 检查表结构匹配性
你当前使用的手动建表结构如下:
需要重点确认字段类型是否和Serilog默认要求一致,90%的手动建表写入失败都是TimeStamp字段类型不匹配导致:
- 必须字段:
Id:int自增主键 / bigint自增主键Message:nvarchar(max)MessageTemplate:nvarchar(max)Level:nvarchar(128)TimeStamp:datetimeoffset类型(不是datetime)Exception:nvarchar(max) 允许为空Properties:nvarchar(max) 允许为空
如果你的TimeStamp字段为datetime类型,直接修改字段类型为datetimeoffset即可解决问题。
3. 检查数据库权限
你使用的是Windows集成身份验证,需要确认程序运行身份有数据库写入权限:
- 控制台程序:运行程序的Windows账户需要对
SvuCommon_Alternate数据库有INSERT权限 - Web项目:IIS对应应用程序池的标识账户需要对
SvuCommon_Alternate数据库有INSERT权限
测试阶段可暂时替换为SQL身份验证的sa账号连接字符串,排除权限问题。
内容的提问来源于stack exchange,提问作者salma baian
相关产品推荐
相关产品推荐

