ASP.NET Core API中Serilog按属性分Sink日志配置失效求助
Serilog按属性分Sink失效问题排查与修复
以下是导致当前配置不生效的核心问题及对应修复方案:
1. 配置文件Filter表达式语法错误
你在appsettings.json中使用了C#方法调用Matching.WithProperty('LogType', 'File')作为过滤表达式,但Serilog配置文件仅支持Serilog原生表达式语言,这种写法无法被解析。
修复:修改Filter表达式
修改File Sink的过滤规则:
"Filter": [ { "Name": "ByIncluding", "Args": { "Expression": "@LogType = 'File'" } } ]
修改Seq Sink的过滤规则:
"Filter": [ { "Name": "ByExcluding", "Args": { "Expression": "@LogType = 'File'" } } ]
2. 缺少表达式过滤依赖包
基于表达式的过滤功能需要Serilog.Filters.Expressions包支持,你当前的配置中未引入该包,导致过滤逻辑完全不生效。
修复:安装依赖并配置引用
- 安装对应版本的NuGet包:
Install-Package Serilog.Filters.Expressions -Version 2.3.0
(或使用.NET CLI:dotnet add package Serilog.Filters.Expressions --version 2.3.0)
- 在appsettings.json的
Serilog.Using数组中添加包引用:
"Using": [ "Serilog.Exceptions", "Serilog.Filters.Expressions" ]
3. 全局日志级别限制导致Info日志被过滤
你配置的LevelSwitches默认级别为Error,而LogInfo方法使用的是Information级别日志。根据Serilog的全局级别规则,低于Error级别的日志会被直接过滤,导致Seq中看不到这类日志。
修复:调整全局级别开关
如果需要记录Information级别日志,修改LevelSwitches默认值:
"LevelSwitches": { "$controlSwitch": "Information" }
4. 初始化代码冗余优化
ReadFrom.Configuration(configuration)已经读取了appsettings中的所有Enrich配置,后续重复添加的.Enrich.FromLogContext()、.Enrich.WithExceptionDetails()属于冗余操作,可删除以避免重复配置:
修改后的初始化代码:
public static class SerilogLoggerExtension { public static void Initialize(ILoggerFactory loggerFactory, IConfiguration configuration) { Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .Enrich.WithEnvironmentUserName() .CreateLogger(); loggerFactory.WithFilter(new FilterLoggerSettings { {"Trace",LogLevel.Trace }, {"Default", LogLevel.Trace}, {"Microsoft", LogLevel.Warning}, {"System", LogLevel.Warning} }) .AddSerilog(); } }
补充检查点
- 确认
BasicAuthorizeAttribute中的siteCode、url等变量已正确赋值,否则LogAuthInfo方法可能不会被触发; - 验证
LogContext.PushProperty的using块范围正确,确保属性仅在目标日志中生效,不会污染其他日志。
内容的提问来源于stack exchange,提问作者Vidhu
相关产品推荐
相关产品推荐

