【问题标题】:Serilog : how to NOT log some requests (or to log with different levels)Serilog:如何不记录某些请求(或以不同级别记录)
【发布时间】:2020-12-18 07:20:24
【问题描述】:

目前,我启用 Serilog 来记录对我的服务器发出的所有 HTTP 请求(请参阅下面的 Program.cs 和 logging.json)。

但是,Openshift 正在调用 /ready 和 /live,我不想记录这些请求

{"@t":"2020-12-17T15:02:08.7321442Z","@m":"HTTP \"GET\" \"/ready\" responded 200 in 41.3777 ms","@i":"62d0885c","RequestMethod":"GET","RequestPath":"/ready","StatusCode":200,"Elapsed":41.3777,"SourceContext":"Serilog.AspNetCore.RequestLoggingMiddleware","RequestId":"0HM52JISL6NBA:00000001","SpanId":"|d7e25f1-47c5ac680b1d5fd1.","TraceId":"d7e25f1-47c5ac680b1d5fd1","ParentId":"","ConnectionId":"0HM52JISL6NBA"}

问题是我仍然想记录其他请求...

有人可以向我解释一下我可以在哪里挂钩这个逻辑吗?

程序.cs

class Program
{
    static async Task Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(provider: ConfigMapFileProvider.FromRelativePath("conf"), path: "logging.json", optional: false, reloadOnChange: true)
                .Build()
            )
            .Enrich.FromLogContext()
            .WriteTo.Console(new RenderedCompactJsonFormatter())
            .CreateLogger();

        await Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("conf/network.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("conf/messagebus.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("conf/auth.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("conf/appsettings.json", optional: false, reloadOnChange: false);
            })
            .ConfigureWebHostDefaults(options =>
            {
                options.UseSerilog();
                options.UseKestrel();
                options.UseStartup<Startup>();
            })
            .RunConsoleAsync();
    }
}

logging.json 文件:

{
  //
  // LOGGING
  //
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.EntityFrameworkCore": "Warning",
        "Grpc.AspNetCore": "Warning",
        "ProtoBuf.Grpc": "Warning"
      }
    }
  }
}

【问题讨论】:

    标签: serilog


    【解决方案1】:

    Serilog 支持Filters,您可以根据每个日志事件的属性有选择地包含或排除事件记录。

    在您的情况下,.Filter.ByExcluding 删除有关 RequestPath 特定值的日志条目就可以了:

    using Serilog;
    using Serilog.Filters;
    // ...
    
    Log.Logger = new LoggerConfiguration()
        .Filter.ByExcluding(
            Matching.WithProperty<string>("RequestPath", v =>
                "/ready".Equals(v, StringComparison.OrdinalIgnoreCase) ||
                "/live".Equals(v, StringComparison.OrdinalIgnoreCase)))
        .WriteTo.Console()
        .CreateLogger();
    

    当然,您的日志事件还有其他有趣的属性,例如 RequestMethodSourceContext,如果您愿意,您也可以使用它们来使过滤条件更加具体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 2011-08-04
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多