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

.NET 6控制台应用Serilog写入SQL Server无日志无表问题排查

问题排查与解决

1. 重复配置Serilog Sink导致冲突

你同时通过ReadFrom.Configuration(configuration)读取配置文件中的Serilog设置,又手动调用WriteTo.MSSqlServer添加SQL Server Sink,这种混合配置会引发冲突,导致Sink无法正常工作。

解决方法:二选一,不要混合配置

方案A:保留代码配置,清理配置文件冗余项

修改appsettings.json,删除Serilog节点下的WriteTo数组:

"Serilog": {
  "Using": [ "Serilog.Sinks.MSSqlServer" ],
  "MinimumLevel": "Information"
}

方案B:保留配置文件配置,移除代码手动添加Sink的逻辑

修改Program.cs中的LoggerConfiguration,完全依赖配置文件初始化:

Log.Logger = new LoggerConfiguration()
                .Enrich.FromLogContext()
                .ReadFrom.Configuration(configuration)
                .CreateLogger();

若需添加自定义列(如UserName),可在配置文件的WriteTo.Args中补充columnOptions配置(需对应版本支持)。

2. 连接字符串与权限问题

  • 确认GetSerilogConnectionString()返回的连接字符串完全正确,包含服务器地址、数据库名、合法的身份验证信息(Windows集成验证或SQL账号密码)。
  • 确保连接账号拥有创建表(当AutoCreateSqlTable=true时)和写入数据的权限。

3. 配置读取逻辑的不规范问题

你将日志表名放在ConnectionStrings节点下,虽能读取但不符合配置规范,建议调整:
修改appsettings.json,新增Serilog专属的表名配置:

"Serilog": {
  "Using": [ "Serilog.Sinks.MSSqlServer" ],
  "MinimumLevel": "Information",
  "WriteTo": [
    {
      "Name": "MSSqlServer",
      "Args": {
        "connectionString": "My database connection string goes here",
        "tableName": "LogsTest",
        "autoCreateSqlTable": true
      }
    }
  ],
  "TableName": "LogsTest"
}

同步修改ConfigProvider的表名读取逻辑:

public string GetSerilogTableName()
{
    return _configuration.GetSection("Serilog:TableName").Value;
}

4. 版本兼容性验证

确保Serilog.Sinks.MSSqlServer版本支持.NET 6,建议安装最新稳定版(如v6.x及以上),可通过NuGet命令更新:

Install-Package Serilog.Sinks.MSSqlServer -Version <最新稳定版>

5. 验证配置读取正确性

在初始化Log.Logger前添加调试代码,确认读取到的连接字符串和表名是否正确:

Console.WriteLine($"ConnectionString: {serilogConnectionString}");
Console.WriteLine($"TableName: {serilogTableName}");

若输出为空或错误,需修正配置读取逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:19