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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:24:52