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
相关产品推荐
相关产品推荐

