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

