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

Serilog子日志过滤器失效:Email Sink未按规则过滤日志事件

Serilog Email Sink 过滤规则失效问题

原本运行正常的Serilog配置,新增Email Sink后给每个Sink添加了子日志过滤器,但Email Sink不遵守过滤规则——所有日志事件都会被输出,而非仅包含EmailNotifiable属性的事件。尝试按异常类型过滤也出现同样问题。

配置代码

LoggerConfiguration config = new();

config.WriteTo.Logger(x => x.Filter.ByExcluding(Matching.WithProperty("EmailNotifiable")))
      .WriteTo.Debug(restrictedToMinimumLevel: LogEventLevel.Verbose);

config.WriteTo.Logger(x => x.Filter.ByExcluding(Matching.WithProperty("EmailNotifiable")))
      .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Verbose);

string logFilePath = CreateLogFilePath(_loggerSettings.LogFileDirectory, _loggerSettings.LogFileName);

config.WriteTo.Logger(x => x.Filter.ByExcluding(Matching.WithProperty("EmailNotifiable")))
      .WriteTo.File(logFilePath,
                    rollingInterval: RollingInterval.Day,
                    restrictedToMinimumLevel: LogEventLevel.Information,
                    shared: true);

config.WriteTo.Logger(x => x.Filter.ByIncludingOnly(Matching.WithProperty("EmailNotifiable")))
      .WriteTo.Email(_connection);

日志事件触发代码

_logger.ForContext("EmailNotifiable", true)
       .Warning(new EmailNotifiableException(body), message);

问题原因与解决方法

你的配置存在链式调用逻辑错误:config.WriteTo.Logger(...).WriteTo.Xxx() 的写法并没有把过滤器和对应Sink绑定到同一个子日志器上,后续的.WriteTo.Xxx()是直接追加到主配置的Sink列表中,导致过滤规则完全没生效。

正确写法是将每个Sink的配置包裹在子日志器的Lambda内部:

LoggerConfiguration config = new();

// Debug Sink:排除带EmailNotifiable属性的日志
config.WriteTo.Logger(x => 
    x.Filter.ByExcluding(Matching.WithProperty("EmailNotifiable"))
     .WriteTo.Debug(restrictedToMinimumLevel: LogEventLevel.Verbose));

// Console Sink:排除带EmailNotifiable属性的日志
config.WriteTo.Logger(x => 
    x.Filter.ByExcluding(Matching.WithProperty("EmailNotifiable"))
     .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Verbose));

string logFilePath = CreateLogFilePath(_loggerSettings.LogFileDirectory, _loggerSettings.LogFileName);

// File Sink:排除带EmailNotifiable属性的日志
config.WriteTo.Logger(x => 
    x.Filter.ByExcluding(Matching.WithProperty("EmailNotifiable"))
     .WriteTo.File(logFilePath,
                   rollingInterval: RollingInterval.Day,
                   restrictedToMinimumLevel: LogEventLevel.Information,
                   shared: true));

// Email Sink:仅包含带EmailNotifiable属性的日志
config.WriteTo.Logger(x => 
    x.Filter.ByIncludingOnly(Matching.WithProperty("EmailNotifiable"))
     .WriteTo.Email(_connection));

关键说明

  • 原写法中,config.WriteTo.Logger(...) 创建了带过滤器的子日志器,但后续.WriteTo.Xxx()并未关联这个子日志器,而是直接作用于主配置,等于过滤规则白写。
  • 必须将.WriteTo.Xxx()放在子日志器的Lambda内部,才能让过滤器对该Sink生效。
  • 如果要按异常类型过滤,同样要把过滤逻辑放在子日志器Lambda中,示例:
    config.WriteTo.Logger(x => 
        x.Filter.ByIncludingOnly(e => e.Exception is EmailNotifiableException)
         .WriteTo.Email(_connection));
    

内容的提问来源于stack exchange,提问作者lazarus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:11