【问题标题】:How to format the Level column value in Serilog’s MS Sql Server Sink如何格式化 Serilog 的 MS Sql Server Sink 中的 Level 列值
【发布时间】:2019-07-30 10:42:21
【问题描述】:

我正在尝试在我的 .Net Core API 中使用 Serilog 通过Serilog-Sinks-MSSqlServer 接收器登录到 SQL Server。如果您将StoreAsEnum 属性设置为true,则标准Level 列要么写出完整值(例如信息、警告、错误),要么写出TinyInt 枚举值,如here 所示。我似乎找不到一种简单的方法(例如在 Log4net 和 NLog 中)来格式化输出以仅写入级别的第一个字符(例如 I、W、E)。我尝试将 DataLength 属性设置为 1,但这会导致根本不写入日志条目。

我已经能够使用自定义扩充器完成我想要的行为,该扩充器从标准列中获取 Level 值,然后仅使用第一个字符写入自定义列,同时删除标准 Level 列,但是当我觉得某处可能存在我从未见过的格式化机制时,这似乎有点矫枉过正。

【问题讨论】:

    标签: asp.net-core-webapi serilog


    【解决方案1】:

    对于Serilog.Sinks.MSSqlServer,它没有公开自定义Level 值的简单方法。

    如果您检查MSSqlServerSink,您会看到它通过私有方法将IEnumerable<LogEvent> events 转换为_traits.eventTable,这意味着您无法覆盖方法void FillDataTable(IEnumerable<LogEvent> events)

    另外,对于MSSqlServerSinkTraits,它是internal,你不能继承它来实现你自己的MSSqlServerSinkTrait

    如果您想覆盖 Serilog.Sinks.MSSqlServer 中的某些内容,没有什么是您做不到的。

    为了最简单的方法,您可以考虑分叉Serilog.Sinks.MSSqlServer,并从下面的代码更改GetStandardColumnNameAndValue

    case StandardColumn.Level:
        return new KeyValuePair<string, object>(columnOptions.Level.ColumnName, columnOptions.Level.StoreAsEnum ? (object)logEvent.Level : logEvent.Level.ToString());
    

    logEvent.Level.ToString() 更改为您的预期值,例如logEvent.Level.ToString().Substring(0,1)

    然后构建项目并引用这个项目而不是Serilog.Sinks.MSSqlServer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多