首页 > 解决方案 > appsettings-configuration 中的 Serilog PushProperty 不起作用

问题描述

ASP.NET Core 2.2.0| Serilog.AspNetCore 2.1.1|Serilog.Sinks.File 4.0.0

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

程序.cs

public static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(Configuration)
        .CreateLogger();

    try
    {
        Log.Information("Starting web host");
        CreateWebHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseConfiguration(Configuration)
            .UseSerilog();

启动.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment() || env.IsStaging())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
        app.UseRewriter(new RewriteOptions()
            .AddRedirectToWww()
            .AddRedirectToHttps());
    }
    app.UseSession();
    app.UseAuthentication();
    app.UseMiddleware<SerilogAddUserInfo>();

    app.UseStaticFiles();

    app.UseCookiePolicy();
    app.UseMvc();
}

应用设置.json

"Serilog": {
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "Microsoft": "Information",
      "System": "Warning"
    }
  },
  "Enrich": "FromLogContext",
  "WriteTo": [
    {
      "Name": "File",
      "Args": {
        "path": "logs/log.txt",
        "rollingInterval": "Hour",
        "outputTemplate": "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}"
      }
    }
  ]
}

SerilogMiddleware.cs

public class SerilogAddUserInfo
{
    private readonly RequestDelegate _next;

    public SerilogAddUserInfo(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        using (LogContext.PushProperty("Address", context.Connection.RemoteIpAddress))
        using (LogContext.PushProperty("Session", context.Session.GetString("SessionGUID") ?? "Unknown"))
        {
            await _next.Invoke(context);
        }
    }
}

在中间件中,我想将一些属性(地址、会话等)推送到日志中。当我按照上面的描述配置 Serilog 时,这些属性在日志中不可见。当我使用 Program.cs 中的下一个片段配置 Serilog 时,它实际上可以工作:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .MinimumLevel.Override("System", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Hour,outputTemplate: "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}")
    .CreateLogger();

为什么有区别?或者我如何在 via-appsettings-configured-serilog 上使用 PushProperty 可能性?

标签: c#asp.net-coreserilog

解决方案


只需要.Enrich.FromLogContext()在初始化 Serilog 时添加Program.cs

Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .Enrich.FromLogContext()
        .CreateLogger();

检查Serilog.AspNetCore文档中的内联初始化。


推荐阅读