首页 > 解决方案 > Serilog LogContext.PushProperty 不工作

问题描述

我在 Program.cs 中初始化 Serilog,从 appsettings.json 读取配置,在 Startup.cs -> 配置和使用请求中间件中添加中间件。一些片段:

启动扩展

     public static void UseSerilogRequestMiddleware(this IApplicationBuilder app)
     {
            app.UseMiddleware<RequestMiddleware>();
            app.UseSerilogRequestLogging();
     }

创建记录器

       Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .Enrich.FromLogContext()
                .WriteTo.UDPSink(configuration["Serilog:LogstashUrl"], int.Parse(configuration["Serilog:LogstashPort"]), new JsonFormatter())
                .CreateLogger();

中间件

       public async Task InvokeAsync(HttpContext httpContext)
        {
            if (httpContext == null) throw new ArgumentNullException(nameof(httpContext));

            try
            {
                using (LogContext.PushProperty("CorrelationId", httpContext.GetCorrelationId()))
                using (LogContext.PushProperty("UserName", httpContext.Request.Headers["UserName"]))
                using (LogContext.PushProperty("Path", httpContext.Request.Path))
                using (LogContext.PushProperty("QueryString", httpContext.Request.Query))
                {
                    await _next(httpContext).ConfigureAwait(false);
                }
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(httpContext, ex).ConfigureAwait(false);
            }
        }

应用设置

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "WriteTo": [ { "Name": "Console" } ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithExceptionDetails" ],
    "Filter": [
      {
        "Name": "ByExcluding",
        "Args": {
          "expression": "RequestPath like '/health%'"
        }
      },
      {
        "Name": "ByExcluding",
        "Args": {
          "expression": "RequestPath like '/swagger%'"
        }
      }
    ],
    "LogstashUrl": "logstash-teste-log",
    "LogstashPort": "5045"
  }

在中间件中,我想将一些属性推送到日志中。当我按照上面所写的方式配置 Serilog 时,属性在日志中不可见

标签: c#asp.net-coreserilog

解决方案


推荐阅读