You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:10:23