如何在Serilog中通过过滤器匹配一组EventId中的任意成员?
如何在Serilog中通过过滤器匹配一组EventId中的任意成员?
我太懂你之前那种用字符串匹配EventId的憋屈感了——完全不是Serilog该有的优雅路子!其实你绕远了,Serilog本身就提供了类型安全、简洁直接的方式来处理这种需求,根本不用去转字符串瞎凑。
首先给你纠正一个关键点:新版Serilog的LogEvent对象直接暴露了EventId属性,你完全不需要去Properties字典里扒这个值,这才是官方设计的正确访问方式。
下面给你两种最地道的实现方式:
方式一:单独定义过滤函数(适合逻辑复杂或需要复用的场景)
先定义你要匹配的EventId集合,后续维护起来超方便,加新ID直接往集合里加就行:
// 把要匹配的EventId都放在这里 private static readonly HashSet<int> _targetEventIds = new HashSet<int> { 7702, 7703 }; private static bool IsMessageEvent(LogEvent le) { // 直接用原生的EventId.Id判断,类型安全还高效 return _targetEventIds.Contains(le.EventId.Id); }
然后在Logger配置里直接用这个函数:
Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.Logger(l => l .Filter.ByIncludingOnly(IsMessageEvent) // 这里继续你的其他输出配置 ) .CreateLogger();
方式二:用Lambda表达式内联实现(适合逻辑简单的场景,代码更紧凑)
如果这个过滤逻辑只在这一处用,直接把判断逻辑写在Lambda里就行,省得单独写函数:
var targetEventIds = new HashSet<int> { 7702, 7703 }; Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.Logger(l => l .Filter.ByIncludingOnly(le => targetEventIds.Contains(le.EventId.Id)) // 后续的输出配置 ) .CreateLogger();
为什么你的老方法不好?
- 之前从
Properties里取值是老版本Serilog的做法,现在官方已经把EventId作为LogEvent的直接属性暴露出来了,类型更安全 - 转字符串匹配不仅效率低,还容易踩坑——比如如果有个EventId是17702,你的字符串匹配会误判成符合条件,用原生的
int判断就完全没这个问题
内容来源于stack exchange
相关产品推荐
相关产品推荐

