.net核心日志过滤某些请求

时间:2017-08-17 10:07:24

标签: .net asp.net-core .net-core

在我们的生产环境中,我们有一个负载均衡的.net核心Web服务,因此负载均衡器每秒调用一个特殊/健康URL来检查服务是否仍在运行。当loglevel设置为Info时,由于这些重复调用,日志文件会快速填充。看到有问题的日志来自.net核心框架,我无法看到如何在不过滤掉所有请求的情况下过滤掉这些请求。此类请求的日志示例如下:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5555/Health
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 1674.6082ms 200

知道如何在不过滤掉所有其他请求的情况下过滤掉这些内容吗?

3 个答案:

答案 0 :(得分:0)

是的,您可以设置最低级别的日志记录,它只会记录此级别及更高级别的事件。日志级别优先级为:

  • 追踪
  • 调试
  • 信息
  • 警告
  • 错误
  • 临界

我个人使用Error级别仅记录错误和关键问题,我这样做:

Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Error()   // <--- this sets the minimum level
                .WriteTo.RollingFile(new JsonFormatter(renderMessage: true), 
                    Path.Combine(env.ContentRootPath, "myLog.txt"))
                .CreateLogger();

答案 1 :(得分:0)

另一种选择是仅过滤特定类别。

<强> appsettings.json:

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Microsoft.AspNetCore.Hosting.Internal.WebHost": "Warning",
        "Default": "Info"
      }
    }
  }
}

the docs中有更多信息,请查看&#34;日志过滤&#34;部分。

答案 2 :(得分:0)

我设法使用依赖项注入来覆盖默认的 ILoggerProvider,它可以为 Microsoft.AspNetCore.Hosting.Diagnostics 类别注入我自己的自定义 ILogger,并跳过记录来自我的健康检查端点。这可以过滤掉“请求开始”事件,但“请求完成”事件使用的对象将请求的路径隐藏在私有字段中。我在使用反射检查请求的路径时画了一条线,结果是这样的:

app.Use(async (context, next) =>
{
    if (context.Request.Path != "/api/v1/liveness")
    {
        Console.WriteLine($"info: Microsoft.AspNetCore.Hosting.Diagnostics[1]");
        Console.WriteLine($"      Request starting {context.Request.Protocol} {context.Request.Method} {context.Request.Scheme}://{context.Request.Host}{context.Request.Path} {context.Request.ContentLength ?? 0}");
        var sw = Stopwatch.StartNew();
        await next.Invoke();
        Console.WriteLine($"info: Microsoft.AspNetCore.Hosting.Diagnostics[2]");
        Console.WriteLine($"      Request finished in {sw.Elapsed.TotalMilliseconds}ms {context.Response.StatusCode}");
    }
    else
    {
        // liveness probe logic
    }
})

它完成了工作,因为在我的 appsettings.json 中,我已将该类别的日志级别设置为警告:

"Logging": {
  "LogLevel": {
    "Default": "Information",
    "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning"
  }
}