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

.NET Core中Serilog配置后日志未写入SQL Server数据库的问题

Serilog日志无法写入SQL Server的常见原因与修正方案
  • 版本不兼容问题
    你当前使用的Serilog.Extensions.Logging 1.0.0 是.NET Core 1.x 阶段的远古版本,和当前主流的Serilog MSSqlServer sink存在严重的接口不兼容问题,且该版本本身存在日志转发链路断裂的已知缺陷,哪怕配置完全正确也可能出现日志不落地的情况。需要将该包升级到3.0及以上适配你当前.NET Core SDK版本的稳定版本,同时配套升级Serilog、Serilog.Sinks.MSSqlServer的对应版本,禁止跨大版本混搭依赖。
  • 日志级别过滤拦截
    你的appsettings配置里设置了"MinimumLevel": "Error",意味着只有等级≥Error的日志事件才会被Serilog处理写入。如果你的测试代码里调用的是LogInformation、LogDebug、LogWarning级别的日志方法,这些事件会直接被级别过滤器拦截,根本不会到达写入数据库的sink环节,自然不会有数据入库。建议测试阶段先把最小日志级别临时调整为Debug,验证通路正常后再根据业务需求收紧级别。
  • Sink参数结构不匹配
    当你使用的Serilog.Sinks.MSSqlServer是3.0及以上版本时,原有的平铺式参数(connectionString、tableName、autoCreateSqlTable)已经被废弃,新的sink要求把这些配置嵌套到ConnectionConfig对象中。如果还是沿用旧的参数写法,sink会静默忽略所有无效参数,既不会抛出报错,也不会执行数据库写入逻辑。另外你贴出的配置里connectionString直接写了占位符constr,哪怕参数结构正确,没有有效连接字符串也无法完成写入——虽然你提到表可以自动创建,说明实际配置里连接串是有值的,但依然要检查参数的嵌套结构是否符合当前sink版本的要求。
  • 日志转发链路断裂
    你当前的配置逻辑存在两个独立的日志实例:一个是手动创建的全局静态Log.Logger,另一个是DI容器里通过AddSerilog()注册的日志服务。由于你调用AddSerilog()时没有把手动创建的Serilog实例传入方法,DI容器中注入的ILogger<T>会和你配置的SQL Server sink完全脱节,你通过构造函数注入拿到的日志服务调用方法时,事件只会走默认的控制台输出链路,根本不会被路由到配置好的数据库sink上。
  • 批量写入缓冲未触发
    MSSqlServer sink默认开启批量提交逻辑,只有当缓冲区的日志数量达到阈值、或者等待时间达到配置周期时,才会把批量数据插入数据库。如果你的测试流程是启动项目、写几行日志、立刻停止项目,缓冲区里的日志还没有达到触发刷盘的条件,就会随着进程退出直接丢失,也不会在数据库中看到数据。测试阶段可以临时把sink的batchPostingLimit设置为1、period设置为1秒,让日志实时写入数据库。

修正后的配置调整方向:

  • 移除手动构建ConfigurationBuilder的冗余逻辑,直接依托Host.CreateDefaultBuilder自带的配置读取能力加载appsettings.json
  • 调整AddSerilog()的调用方式,把全局静态日志实例传入方法,打通DI注入的日志服务和全局sink的链路
  • 按照当前sink版本的要求调整appsettings中的参数结构,不要沿用旧版的平铺参数格式
  • 测试阶段放开最小日志级别,调整批量写入的触发阈值,验证日志通路正常后再调整为生产环境的配置参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 06:24:05