如何控制.Net 5 Web API中Serilog的日志输出内容?
问题
在.Net 5 Web API项目中使用Serilog实现日志记录,功能运行正常,但日志文件生成了大量非必要的额外信息(如System.Net.Http相关的HTTP请求处理日志),仅需记录指定的业务日志,如何控制Serilog的日志输出范围?
日志文件内容示例
2022-08-19T11:18:48.4609958-07:00 [Information] () Application Starting.##############3 2022-08-19T11:19:25.0417644-07:00 [Information] (LAFitness.SpotReservation.WebAPI.Queries.Query) GraphQL would be calling the following URL: https://localhost:5001/ 2022-08-19T11:19:25.0695842-07:00 [Information] (System.Net.Http.HttpClient.GraphQLService.LogicalHandler) Start processing HTTP request "GET" https://localhost:5001/rooms/89 2022-08-19T11:19:25.0714494-07:00 [Information] (System.Net.Http.HttpClient.GraphQLService.ClientHandler) Sending HTTP request "GET" https://localhost:5001/rooms/89 2022-08-19T11:19:27.6939187-07:00 [Information] (System.Net.Http.HttpClient.GraphQLService.ClientHandler) Received HTTP response headers after 2616.3589ms - 200 2022-08-19T11:19:27.6956126-07:00 [Information] (System.Net.Http.HttpClient.GraphQLService.LogicalHandler) End processing HTTP request after 2633.29ms - 200
当前appsettings.json中的Serilog配置
"Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "Name": "File", "Args": { "path": "Logs/applog_.log", "outputTemplate": "{Timestamp:o} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ], "Filter": [ { "Name": "ByExcluding", "Args": { "expression": "StartsWith(SourceContext, 'Microsoft.')" } } ] }
解决方案
有三种核心方式可以精准控制Serilog的日志输出范围,保留业务日志:
1. 扩展过滤规则,排除System开头的日志
当前配置仅排除了Microsoft.开头的日志,冗余的HTTP日志来自System.Net.Http命名空间。只需修改Filter表达式,同时排除Microsoft.和System.开头的日志:
修改后的Serilog配置:
"Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "Name": "File", "Args": { "path": "Logs/applog_.log", "outputTemplate": "{Timestamp:o} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ], "Filter": [ { "Name": "ByExcluding", "Args": { "expression": "StartsWith(SourceContext, 'Microsoft.') or StartsWith(SourceContext, 'System.')" } } ] }
2. 仅包含业务命名空间的日志(最精准)
如果业务日志都来自特定命名空间(比如示例中的LAFitness.SpotReservation.WebAPI),可以改用ByIncludingOnly规则,只保留符合条件的日志,彻底过滤所有非业务日志:
修改后的配置:
"Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "Name": "File", "Args": { "path": "Logs/applog_.log", "outputTemplate": "{Timestamp:o} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ], "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "StartsWith(SourceContext, 'LAFitness.SpotReservation.WebAPI')" } } ] }
3. 单独调整HttpClient的日志级别
如果需要保留部分HttpClient日志但减少冗余,可以单独设置System.Net.Http的最低日志级别为Warning或更高,仅记录警告及以上级别的相关日志:
"Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "System.Net.Http": "Warning" } }, "WriteTo": [ { "Name": "File", "Args": { "path": "Logs/applog_.log", "outputTemplate": "{Timestamp:o} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ], "Filter": [ { "Name": "ByExcluding", "Args": { "expression": "StartsWith(SourceContext, 'Microsoft.')" } } ] }
内容的提问来源于stack exchange,提问作者shujaat siddiqui
相关产品推荐
相关产品推荐

