asp.net-core-webapi - 如何格式化 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
但是当我感觉时,这似乎有点矫枉过正可能是我从未见过的格式化机制。
解决方案
对于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
推荐阅读
- php - 如何在特定条件下提取数组中的最高值和最低值?
- regex - 如何在perl中拆分包含连字符的字符串
- sql - 当 1 列为空时,使其他列等于某个数字错误
- c# - 从 WPF 表单中的 Canvas 获取 UI 元素大小
- jquery - 使用显示/隐藏功能根据浏览器语言显示 div(错误:没有显示)
- c# - 编辑器中设置的枚举值在脚本中未更改
- sql-server - CDC 跟踪对未更改的列所做的更改
- sql-server - 将一个复杂的 SQL 查询解构为多个查询和连接
- hibernate - Spring Boot Hibernate - 使用@OneToMany 定位未映射的类
- python - Tensorflow:获取张量中每行/列之间的差异