默认情况下阻止Serilog写入HTTP事件

时间:2020-08-20 19:14:35

标签: c# .net-core serilog

我是.NET Core应用程序中的injecting typed HTTP clients。我也在用Serilog登录。我没有故意配置任何HTTP活动的日志记录。它神奇地来了。我该如何关闭?

[12:00:52 INF] Start processing HTTP request POST https://foo/bar
[12:00:52 INF] Sending HTTP request POST https://foo/bar
[12:00:53 INF] Received HTTP response after 707.8906ms - OK

我的HTTP客户端配置:

services.AddHttpClient("FOO")
    .ConfigureHttpClient(client =>
        {
            client.BaseAddress = new Uri("https://foo/");
        })
    .ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler()
        {
            Credentials = new NetworkCredential("user", "pass"),
            ServerCertificateCustomValidationCallback = (senderC, cert, chain, sslPolicyErrors) => true
        })
    .AddTypedClient<Thing1>()
    .AddTypedClient<Thing2>();

1 个答案:

答案 0 :(得分:2)

我遇到了这个问题,并且能够使用Serilog的Filter配置来解决。不确定在哪里记录(this appears to be related),但是一种途径是实现ILogEventFilter接口(source)。包括允许事件的逻辑,并插入配置。

示例过滤器类:

public class MyLoggingFilter : ILogEventFilter
{
    private static readonly HashSet<string> ignoredMessages = new HashSet<string>(StringComparer.Ordinal)
    {
        "Start processing HTTP request {HttpMethod} {Uri}",
        "End processing HTTP request after {ElapsedMilliseconds}ms - {StatusCode}"
    };

    // Allow the event to be logged if the message template isn't one we ignore
    public bool IsEnabled(LogEvent logEvent) => !ignoredMessages.Contains(logEvent.MessageTemplate.Text);
}

已添加到配置(在这种情况下为Program.cs):

config
    .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
    .Enrich.FromLogContext()
    .Filter.With<MyLoggingFilter>() // <-- Plug in your filter type
    .WriteTo.Console(theme: AnsiConsoleTheme.Code)
    .WriteTo.Debug()
    // etc

或者,如果要防止与HttpClient相关的任何日志记录,请使用所需的日志级别覆盖类别(即名称空间类型):

config.MinimumLevel.Override("System.Net.Http.HttpClient", LogEventLevel.Warning)