如何在ASP.NET Core MVC中阻止Serilog记录HTTP GET请求
如何阻止Serilog自动记录HTTP GET接口调用的日志?
Serilog已成功实现日志记录,但会自动生成HTTP GET请求的日志,例如日志中存在如下记录:
2024-10-25 06:24:10.040 -04:00 [INF] HTTP GET / responded 200 in 6107.3816 ms
当前相关配置如下:
Program.cs代码
builder.Host.UseSerilog((context, configuration) => { var requestLoggingOptions = new RequestLoggingOptions(); configuration.ReadFrom.Configuration(context.Configuration); });
appsettings.json配置
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Warning", // 以Microsoft开头的日志需达到Warning级别才记录 "Microsoft.AspNetCore": "Warning", "System": "Warning", // 以System开头的日志需达到Warning级别才记录 "System.Net.Http.HttpClient": "Warning" // 可能因上方配置无需单独设置 } }, "WriteTo": [ ... 已省略 ... ], "Filter": [ { "Name": "ByExcludingOnly", "Args": { "expression": "e.Request.Method == \"GET\"", } } ] },
已尝试调整最低级别配置和过滤规则,但GET请求日志仍会生成。
解决方案
1. 修正过滤表达式(针对请求日志属性)
Serilog.AspNetCore生成的请求日志中,HTTP方法存储在RequestMethod属性中,而非e.Request.Method;同时建议使用ByExcluding替代ByExcludingOnly(后者仅在无其他规则时生效)。修改appsettings.json的Filter配置:
"Filter": [ { "Name": "ByExcluding", "Args": { "expression": "RequestMethod == \"GET\"" } } ]
2. 通过请求日志选项直接过滤GET请求
在Program.cs中手动配置请求日志中间件,将GET请求的日志级别设为低于你设置的最低级别(Debug),从而自动忽略:
builder.Host.UseSerilog((context, configuration) => { configuration.ReadFrom.Configuration(context.Configuration); }); // 配置请求日志过滤规则 app.UseSerilogRequestLogging(options => { options.GetLevel = (httpContext, elapsed, ex) => httpContext.Request.Method != "GET" ? LogEventLevel.Information : LogEventLevel.Verbose; });
3. 修复JSON配置语法错误(关键!)
原appsettings.json中"System": "Warning"行后缺少逗号,导致JSON解析失败,后续的Filter配置未被加载。修正后的配置片段:
"Override": { "Microsoft": "Warning", "Microsoft.AspNetCore": "Warning", "System": "Warning", "System.Net.Http.HttpClient": "Warning" }
4. 可选:禁用所有请求日志(不推荐,仅需禁用GET时不用)
若要完全禁用所有HTTP请求日志,可在MinimumLevel.Override中添加:
"Serilog.AspNetCore.RequestLoggingMiddleware": "None"
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

