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

.NET 6使用Serilog Sink写入Oracle数据库无日志无报错求助

排查Serilog写入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:33:10