Serilog自定义Sink:appsettings.json配置最低日志级别无效
问题原因与解决方法
你的自定义Sink无法生效restrictedToMinimumLevel参数的核心原因是:扩展方法没有接收该参数,也未将级别过滤逻辑绑定到Sink配置中。Serilog不会自动为自定义Sink处理级别过滤,需要你在扩展方法中明确对接该参数并应用过滤规则。
修改步骤
1. 更新扩展方法,添加级别参数
修改SerilogExtensions类中的MyCustomSink方法,新增LogEventLevel类型的restrictedToMinimumLevel参数,并将其传递给Serilog的Sink重载方法——该重载会自动帮你过滤低于指定级别的日志,无需在Emit中手动判断:
namespace CustomSerilogTest { public class MyCustomSink : ILogEventSink { private readonly IFormatProvider _formatProvider; public MyCustomSink(IFormatProvider formatProvider) { _formatProvider = formatProvider; } public void Emit(LogEvent logEvent) { // 现在只会接收到级别>=Error的日志 var message = logEvent.RenderMessage(_formatProvider); } } public static class SerilogExtensions { public static LoggerConfiguration MyCustomSink( this LoggerSinkConfiguration loggerConfiguration, LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum, IFormatProvider formatProvider = null) { // 传递最小级别参数,Serilog会在日志到达Sink前完成过滤 return loggerConfiguration.Sink(new MyCustomSink(formatProvider), restrictedToMinimumLevel); } } }
2. 确认配置匹配
你的appsettings.json配置是正确的:Args中的restrictedToMinimumLevel参数名称与扩展方法中的参数名称完全一致,Serilog会自动将配置字符串(如"Error")转换为对应的LogEventLevel枚举值。
可选:手动在Emit中过滤(不推荐)
如果需要更个性化的过滤逻辑,也可以在Emit方法中手动判断日志级别,但这种方式效率更低(日志已到达Sink才执行过滤):
public void Emit(LogEvent logEvent) { if (logEvent.Level < LogEventLevel.Error) return; var message = logEvent.RenderMessage(_formatProvider); }
优先推荐第一种方法,利用Serilog内置的过滤机制在日志流早期完成过滤,提升整体性能。
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

