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

