You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:42:52