Serilog.Sinks.EventLog过滤失效问题咨询及修复方法
Serilog.Sinks.EventLog 过滤失效问题解决
结论:EventLog Sink 支持过滤
Serilog.Sinks.EventLog本身不直接内置过滤能力,但可以通过Serilog的sink级嵌套Logger配合Serilog.Filters.Expressions实现精准过滤,你的配置问题出在结构和表达式细节上。
修复步骤
1. 修正配置结构
Serilog的sink级过滤不能直接在EventLog节点下配置Filter,需要用WriteTo.Logger将EventLog sink包裹,把过滤规则放在嵌套的Logger配置中。
替换你原有的EventLog sink配置为以下内容:
{ "Name": "Logger", "Args": { "configureLogger": { "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "Contains(RenderedMessage, 'EventLog:')" } } ], "WriteTo": [ { "Name": "EventLog", "Args": { "source": "WebUI Application", "logName": "Application", "manageEventSource": true, "restrictedToMinimumLevel": "Verbose", "levelSwitch": "$controlSwitch" } } ] } } }
2. 修正过滤表达式
你原表达式中使用的@Message指向的是原始消息模板(未替换占位符的文本),如果要匹配渲染后的最终日志内容,需要改用RenderedMessage属性。
如果是要匹配自定义日志属性(比如你有一个名为Category的属性),表达式可以写为:
Category = 'EventLog'
3. 确认依赖包有效性
你已安装的SerilogExpressions v4.0.0是正确的依赖,它负责解析过滤表达式,无需额外安装其他包。
原理说明
Serilog的顶层配置中,WriteTo下的sink本身不支持直接挂过滤规则,必须通过嵌套Logger节点来实现:外层Logger先执行过滤逻辑,仅将符合条件的日志传递给内层的EventLog sink,从而实现sink级别的日志过滤。
内容的提问来源于stack exchange,提问作者Howard Shank
相关产品推荐
相关产品推荐

