.NET 6 WebAPI中Serilog Enrichers配置及相关问题咨询
Serilog配置问题解答
问题背景
在.NET 6 WebAPI中配置Serilog后,appsettings里的Enrich增强器未生效,配置及Program.cs代码如下:
appsettings.json配置:
"Serilog": { "Using": [ "Serilog.Sinks.File" ], "Enrich": [ "WithHttpRequestId", "WithExceptionDetails", "WithClientIp" ], "MinimumLevel": { "Default": "Information" }, "WriteTo": [ { "Name": "File", "Args": { "path": "../../../../../Logs/MyApp/MyApp-.log", "rollingInterval": "Day", "retainedFileCountLimit": "7", "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {CorrelationId} {Level:u3}] {Username} {Message:lj}{NewLine}{Exception} {Properties:lj}{NewLine}" } } ] }
Program.cs配置代码:
var logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .Enrich.FromLogContext() .CreateLogger(); builder.Logging.ClearProviders(); builder.Logging.AddSerilog(logger);
预期记录HttpRequestId、ClientIp及自动捕获异常详情,但日志中未显示这些信息,现解答如下:
1. 配置是否正确?尤其是outputTemplate?
你的配置存在几个关键问题:
- 增强器依赖缺失:
WithHttpRequestId、WithClientIp属于ASP.NET Core专属增强器,需安装Serilog.AspNetCore包;WithExceptionDetails需要Serilog.Enrichers.Exception包,且必须在Using数组中添加对应程序集(如"Serilog.AspNetCore"、"Serilog.Enrichers.Exception"),否则配置文件中的增强器无法被加载。 - outputTemplate变量不匹配:你用了
{CorrelationId},但配置的增强器是WithHttpRequestId,应替换为{HttpRequestId};如果需要CorrelationId,需单独配置WithCorrelationId增强器及对应依赖包。 - 自动捕获异常的误解:
WithExceptionDetails仅用于增强已手动记录异常的输出细节,不会自动捕获未处理的请求异常。要自动记录未处理异常,需在Program.cs中添加异常处理中间件,或使用Serilog.AspNetCore自带的请求日志中间件捕获请求内异常。 - 程序集引用问题:若未安装对应增强器的NuGet包,即便配置了Enrich数组,增强器也不会生效。
2. 是否存在可自动记录每个请求和响应(包括请求体及参数)的增强器?
官方Serilog.AspNetCore包提供的UseSerilogRequestLogging中间件,可自动记录每个请求的基础信息(路径、HTTP方法、状态码、耗时等)。若需记录请求体,需自定义配置:
- 通过中间件读取请求体并添加到日志上下文,示例代码:
app.UseSerilogRequestLogging(options => { options.EnrichDiagnosticContext = (diagnosticContext, httpContext) => { diagnosticContext.Set("RequestBody", ReadRequestBody(httpContext.Request)); }; }); // 辅助方法:读取可重读的请求体 private static string ReadRequestBody(HttpRequest request) { request.EnableBuffering(); using var reader = new StreamReader(request.Body, leaveOpen: true); var body = reader.ReadToEnd(); request.Body.Position = 0; return body; }
- 部分社区包可直接实现请求体记录(如
Serilog.Enrichers.RequestBody),但需注意处理大请求体的性能问题,以及敏感数据的过滤逻辑。
3. 日志文件保留7天,Serilog何时删除旧文件?
你设置的retainedFileCountLimit: "7"是按文件数量保留,结合rollingInterval: "Day"(每日生成一个文件),实际会保留最近7天的日志文件:
- 清理时机:Serilog会在创建新的滚动日志文件时自动清理旧文件,比如每日零点生成新日志时,会检查并删除超出数量限制的最旧文件,无需等待服务器重启。
- 生产环境行为:与开发环境一致,运行时生成新文件时自动执行清理,服务连续运行期间会每日自动维护日志文件数量,并非仅在重启时处理。
内容的提问来源于stack exchange,提问作者wally2
相关产品推荐
相关产品推荐

