如何减少Serilog中HttpClient调用的冗余日志?
解决Serilog下HttpClient INFO日志过多的问题
方案一:直接在代码里过滤HttpClient日志
你当前的Serilog配置是硬编码实现的,没有读取appsettings.json的设置,所以之前在配置文件里的修改不生效。可以直接在LoggerConfiguration中添加过滤规则,屏蔽HttpClient的INFO日志:
var loggerConfig = new LoggerConfiguration() // 过滤掉System.Net.Http命名空间下的INFO及更低级别日志 .Filter.ByExcluding(logEvent => logEvent.Properties.TryGetValue("SourceContext", out var sourceCtx) && sourceCtx.ToString().Contains("System.Net.Http") && logEvent.Level <= LogEventLevel.Information) .WriteTo.Console() .WriteTo.File($"logs/log-{DateTime.Now:dd.MM.yy_HH.mm}.log") .CreateLogger();
如果需要更精准过滤(比如只针对HttpClient的特定Handler日志),可以调整条件:
.Filter.ByExcluding(logEvent => logEvent.Properties.TryGetValue("SourceContext", out var sourceCtx) && (sourceCtx.ToString().StartsWith("\"System.Net.Http.HttpClient") || sourceCtx.ToString().Contains("HttpMessageHandler")) && logEvent.Level == LogEventLevel.Information)
方案二:让Serilog读取appsettings.json配置
如果想通过配置文件统一管理日志级别,需要修改代码让Serilog加载配置文件:
- 确保appsettings.json里的Serilog配置正确:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "System.Net.Http.HttpClient": "Warning" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "logs/log-.log", "rollingInterval": "Day", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" } } ] } }
这里把日志设置为按天滚动,避免每次启动生成新文件,更符合实际使用场景。
- 修改Logger创建代码,读取配置:
var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var loggerConfig = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); services.AddLogging(options => options.AddSerilog(loggerConfig, dispose: true));
这样appsettings里的Override设置就会生效,HttpClient的INFO日志将不再输出。
补充说明
- 如果是命名HttpClient(比如用
services.AddHttpClient("MyCustomClient")注册的),对应的日志SourceContext会是System.Net.Http.HttpClient.MyCustomClient.LogicalHandler或System.Net.Http.HttpClient.MyCustomClient.ClientHandler,需要在配置文件的Override里写成"System.Net.Http.HttpClient.MyCustomClient": "Warning"才能生效。 - 可以根据需求调整日志级别为
LogEventLevel.Error,进一步缩小日志范围,只保留错误级别的记录。
内容的提问来源于stack exchange,提问作者muttley91
相关产品推荐
相关产品推荐

