【问题标题】:Change logging verbosity level for health check endpoint in ASP.NET Core application更改 ASP.NET Core 应用程序中运行状况检查端点的日志记录详细级别
【发布时间】:2021-10-14 13:55:30
【问题描述】:

我有一个 ASP.NET Core 应用程序(实际上是 .NET 5),它具有以标准方式实现的健康检查端点

services.AddHealthChecks()...

运行状况检查工作正常。问题是它们经常被调用,因此它们会在我们的存储中生成大量日志。

服务在 appsettings.json 中具有标准的 .NET 日志记录机制和默认值,例如

  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Debug",
      "Microsoft.Hosting.Lifetime": "Debug"
    }
  },

问题是我如何才能更改这个非常健康检查的详细级别(例如到Information)(以及它内部的实现,如EF.Core 的东西或其他任何东西),同时保持它为Debug in所有其他地方? 是否有任何参数或设置可以帮助解决这个问题?

这里的目标是减少日志存储消耗。

【问题讨论】:

  • 您在配置中看到 LogLevel 元素了吗?运行状况检查记录的名称空间是什么?您是否尝试过将其添加到那里,并配置最低级别,例如“信息”?在github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/blob/…(通过documentation 找到的存储库中的随机文件)看起来它的日志命名空间是“HealthChecks”。
  • @CodeCaster 禁用命名空间的日志记录也会在所有其他地方禁用它们,而不仅仅是在运行状况检查特定的“调用堆栈”中。如果我做对了。此外,配置中的 HealthChecks=None 只能禁用特定的健康检查内容,而不是所有其他内容,例如在健康检查中使用的数据库访问过程。
  • 啊,你的意思是健康检查可能会执行一个查询,该查询又会在其自己的记录器名称上触发 SQL 调试日志记录?也许一些示例日志会澄清这一点。
  • 这些日志通常看起来像dbug: Microsoft.EntityFrameworkCore.Database.Connection[20000] Opening connection to database 'some_db' on server 'tcp://localhost:5432'.
  • 我对@AndrewSilver 的帖子进行了编辑,它可能不是您的理想选择,但它是一个解决方案。

标签: c# asp.net-core logging health-monitoring


【解决方案1】:

在设置文件中:

"Logging": {
  "LogLevel": {
    "Default": "Debug",
    "Microsoft": "Debug",
    "Microsoft.Hosting.Lifetime": "Debug"
  }
},

您可以通过在 LogLevel 配置对象中指定 "namespace":"LogLevel" 在命名空间级别配置 LogLevel。

例如:

您会看到很多 dbug: Microsoft.EntityFrameworkCore.Database.Connection[20000] Opening connection to database 'some_db' on server 'tcp://localhost:5432' 消息。

正如您可以通过该行本身判断的那样,它们来自Microsoft.EntityFrameworkCore.Database.Connection 对象,位于Microsoft.EntityFrameworkCore.Database 命名空间内。

因此,您可以将 MicrosoftMicrosoft.EntityFrameworkCore 甚至 Microsoft.EntityFrameworkCore.Database 命名空间的 LogLevel 修改为 Information,例如:

"Logging": {
  "LogLevel": {
    "Default": "Debug",
    "Microsoft": "Debug",
    "Microsoft.Hosting.Lifetime": "Debug",
    "Microsoft.EntityFrameworkCore.Database": "Information"
  }
},

现在dbug: Microsoft.EntityFrameworkCore.Database.Connection[20000] Opening connection to database 'some_db' on server 'tcp://localhost:5432' 行不会被记录,因为它的级别是Debug,并且最小阈值配置为Information

编辑

您似乎正在尝试根据请求的上下文进行过滤,而不是仅使用命名空间。

AFAIK,aspnetcore 日志记录包无法做到这一点。 另一方面,SerilogSerilog.Expressions 的帮助下可以过滤掉来自特定请求的日志消息。

来自 Serilog.Expressions 自述文件:

过滤示例

Serilog.Expressions 将 ByExcluding() 和 ByIncludingOnly() 重载添加到接受过滤器表达式的过滤器配置对象:

Log.Logger = new LoggerConfiguration()
 .Filter.ByExcluding("RequestPath like '/health%'")
 .CreateLogger();

【讨论】:

  • 我相信 cmets,他们确实想要Microsoft.EntityFrameworkCore.Database调试日志,除了从 HealthCheck 模块登录时。
  • @CodeCaster 非常感谢。想象一下这种情况。有很多健康检查端点调用,其中有很多日志是从 healthcheck 写入的。这些记录非常重复,在这里不是很有用。但它们在其他地方也很有用
  • 感谢您的编辑 Pablo。是的,我知道 Serilog 能够做到这一点,我以前看过一些关于它的文章。但我正在寻找使用标准 .NET Core 日志记录机制的类似实现
  • 最好的方法是根据请求上下文中的 url 更改记录器。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 2019-08-07
  • 2016-05-04
  • 1970-01-01
  • 2016-03-09
  • 2015-01-17
  • 2020-10-12
  • 2016-12-20
相关资源
最近更新 更多