.NET 6使用Serilog Sink写入Oracle数据库无日志无报错求助
以下是针对你的配置和代码的几个关键排查点:
1. 日志上下文属性与配置列名不匹配
你的appsettings.json中定义的自定义列名,和代码里LogContext.PushProperty的属性名存在多处不一致:
- 配置列名是
Source,但代码中推送的是Source_Txt - 配置列名是
Message_TXT,代码中推送的是Message_txt - 配置列名是
TimeStamp_Dt,代码中推送的是TimeStamp_DT
Serilog会严格按照属性名匹配列名,哪怕是大小写或下划线位置差异都会导致数据无法映射到对应列。需要将代码中的属性名完全对齐配置里的列名:
LogContext.PushProperty("Application", "TEST"); LogContext.PushProperty("Source", "SERILOG"); LogContext.PushProperty("Message_TXT", message); LogContext.PushProperty("TimeStamp_Dt", DateTime.Now);
2. 日志上下文作用域未正确托管
LogContext.PushProperty返回的是IDisposable对象,必须通过using语句限定作用域,才能确保属性被正确关联到后续的日志事件中。当前代码直接推送属性后写日志,可能导致上下文未生效:
using (LogContext.PushProperty("Application", "TEST")) using (LogContext.PushProperty("Source", "SERILOG")) using (LogContext.PushProperty("Message_TXT", message)) using (LogContext.PushProperty("TimeStamp_Dt", DateTime.Now)) { logger.Information(message); }
3. Oracle数据类型配置错误
你配置中使用的nvarchar并非Oracle原生数据类型,Oracle对应的可变长度Unicode字符串类型是NVARCHAR2;另外date类型仅存储日期和时分秒,若需要更精确的时间戳,建议改用TIMESTAMP类型。修改配置中的数据类型:
"customColumns": [ { "ColumnName": "Application", "DataType": "NVARCHAR2", "DataLength": "10" }, { "ColumnName": "Source", "DataType": "NVARCHAR2", "DataLength": "10" }, { "ColumnName": "Message_TXT", "DataType": "NVARCHAR2", "DataLength": "4000" }, { "ColumnName": "TimeStamp_Dt", "DataType": "TIMESTAMP" } ]
4. 开启Serilog自我日志排查内部错误
Serilog默认会吞掉Sink的内部错误,导致你看不到写入失败的原因。可以在Program.cs开头添加自我日志输出,查看具体错误:
Serilog.Debugging.SelfLog.Enable(Console.WriteLine);
运行程序后,控制台会输出Serilog内部的调试信息,比如数据库连接失败、插入语句错误等。
5. 验证连接字符串与数据库权限
确保connectionString是有效的Oracle连接字符串(替换掉xxx),格式类似:
User Id=your_user;Password=your_pwd;Data Source=//host:port/service_name;
同时确认程序运行账号有Log表的INSERT权限,若权限不足会导致写入失败但无明显报错。
6. 验证日志事件是否生成
可以临时添加Console Sink,验证日志事件是否正常生成:
在appsettings.json的WriteTo数组中添加:
{ "Name": "Console" }
如果控制台能输出日志,但Oracle数据库没有数据,说明问题出在Oracle Sink的配置或数据库端;如果控制台也无输出,检查日志级别配置是否正确。
内容的提问来源于stack exchange,提问作者Subash Subramaniam

