ASP.NET Core中Serilog多日志文件配置失效问题求助
问题原因
当前Serilog配置仅添加了两个文件接收器,但未给每个接收器设置日志过滤规则,所有满足Information级别及以上的日志会被所有接收器处理,因此TCP和REST模块的日志都会写入两个文件。
解决方法
需为每个文件接收器添加过滤条件,只允许对应SourceContext的日志写入,以下是两种可行方案:
方案1:修改appsettings.json配置
在每个WriteTo节点中添加Filter配置,通过表达式过滤指定SourceContext的日志:
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ], "MinimumLevel": { "Default": "Information", "Override": { "TCP": "Information", "REST": "Information" } }, "WriteTo": [ { "Name": "File", "Args": { "path": "C:\\path\\TCP.log", "rollingInterval": "Infinite", "fileSizeLimitBytes": 1073741824, "restrictedToMinimumLevel": "Information" }, "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "SourceContext = 'TCP'" } } ] }, { "Name": "File", "Args": { "path": "C:\\path\\REST.log", "rollingInterval": "Infinite", "fileSizeLimitBytes": 1073741824, "restrictedToMinimumLevel": "Information" }, "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "SourceContext = 'REST'" } } ] } ], "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ] }
注意:需先安装
Serilog.Filters.ExpressionsNuGet包,否则表达式过滤规则无法生效。
方案2:通过Program.cs代码配置
若偏好代码方式配置,可在Serilog初始化时为每个文件接收器添加过滤逻辑:
builder.Host.UseSerilog((context, services, configuration) => configuration .ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext() .Enrich.WithMachineName() .Enrich.WithProcessId() // 移除配置文件中的两个File接收器,改用代码添加并过滤 .WriteTo.File( path: "C:\\path\\TCP.log", rollingInterval: RollingInterval.Infinite, fileSizeLimitBytes: 1073741824, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, filter: (logEvent) => logEvent.Properties.ContainsKey("SourceContext") && logEvent.Properties["SourceContext"].ToString().Trim('"') == "TCP" ) .WriteTo.File( path: "C:\\path\\REST.log", rollingInterval: RollingInterval.Infinite, fileSizeLimitBytes: 1073741824, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, filter: (logEvent) => logEvent.Properties.ContainsKey("SourceContext") && logEvent.Properties["SourceContext"].ToString().Trim('"') == "REST" ) );
注意:使用此方案时,需删除appsettings.json中
WriteTo下的两个File节点,避免重复配置。
额外注意事项
Log.ForContext("SourceContext", "XXX")中的字符串需和过滤条件完全一致,区分大小写。- 若使用配置文件方案,必须确保已安装
Serilog.Filters.Expressions依赖包。
内容的提问来源于stack exchange,提问作者Murf
相关产品推荐
相关产品推荐

