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

能否在Serilog的appsettings.json中按日志级别条件设置Enrichers

按日志级别条件控制Serilog Enrichers的启用

是的,可以实现这个需求。Serilog本身没有原生支持在appsettings.json中直接按级别过滤Enrichers,但通过两种方式可以达成目标:借助Serilog.Expressions包的内置功能,或者自定义条件Enricher。

方法一:使用Serilog.Expressions的Enrich.When(推荐,无需自定义代码)

先安装Serilog.Expressions NuGet包,然后在appsettings.json中配置条件Enrich逻辑:

{
  "Serilog": {
    "Using": [ "Serilog.Expressions" ],
    "MinimumLevel": "Information",
    "Enrich": [
      // 所有级别都生效的基础Enricher
      "FromLogContext",
      "WithMachineName",
      // 仅Error/Fatal级别生效的Enricher
      {
        "Name": "When",
        "Args": {
          "condition": "@Level in ['Error', 'Fatal']",
          "enrichers": [
            "WithRequestId",
            "WithUserName",
            "WithEnvironmentUserName"
          ]
        }
      }
    ],
    "WriteTo": [
      {
        "Name": "Console"
      }
    ]
  }
}

这个配置里,WithRequestId这类Enricher只会在日志级别为Error或Fatal时触发,其他级别仅保留FromLogContext、WithMachineName提供的基础附加信息。

方法二:自定义条件Enricher(适配复杂逻辑)

如果需要更复杂的判断规则,可以自定义一个Enricher,仅在指定级别下执行子Enricher:

1. 实现自定义Enricher类

using Serilog.Core;
using Serilog.Events;

public class ConditionalErrorEnricher : ILogEventEnricher
{
    private readonly ILogEventEnricher[] _targetEnrichers;
    private readonly LogEventLevel[] _enabledLevels = { LogEventLevel.Error, LogEventLevel.Fatal };

    public ConditionalErrorEnricher(params ILogEventEnricher[] targetEnrichers)
    {
        _targetEnrichers = targetEnrichers ?? Array.Empty<ILogEventEnricher>();
    }

    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        if (_enabledLevels.Contains(logEvent.Level))
        {
            foreach (var enricher in _targetEnrichers)
            {
                enricher.Enrich(logEvent, propertyFactory);
            }
        }
    }
}

2. 在appsettings.json中配置

确保配置引用了自定义Enricher所在的程序集,然后添加该Enricher:

{
  "Serilog": {
    "Using": [ "YourProjectAssemblyName" ],
    "MinimumLevel": "Information",
    "Enrich": [
      "FromLogContext",
      "WithMachineName",
      {
        "Name": "ConditionalErrorEnricher",
        "Args": {
          "targetEnrichers": [
            "WithRequestId",
            "WithUserName"
          ]
        }
      }
    ],
    "WriteTo": [
      {
        "Name": "Console"
      }
    ]
  }
}

注意事项

  • 基础Enricher(如WithMachineName)放在Enrich数组顶部,确保所有级别都能获取这些信息;
  • 条件Enricher需明确指定触发的级别范围;
  • 使用Serilog.Expressions时,条件表达式支持Serilog语法,可扩展更复杂的判断(如结合日志属性)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:45:29