首页 > 解决方案 > 如何格式化 Serilog 的 MS Sql Server Sink 中的 Level 列值

问题描述

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

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

标签: asp.net-core-webapiserilog

解决方案


对于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


推荐阅读