如何防止 NLog 处理引用库中的日志语句?

Gen*_*ari 3 error-handling nlog .net-core asp.net-core microsoft-extensions-logging

每当我们的 API 中发生错误时,我们最终都会因为一个错误而收到多封电子邮件。基于日志消息;我们可以看到这些其他电子邮件似乎正在生成,因为各种 Microsoft 库正在调用类似_logger.LogError我们自己的 _ 的东西logger.LogError,这在我们处理错误时发生。

例如,当数据库超时时,我们会看到来自这些不同类别的 4 封电子邮件:

  • Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Query
  • Web.Controllers.ErrorController(我们自己的异常处理程序;这是我们唯一想看到的)

最后一个是唯一一个具有我们自己的错误格式并包含有用信息(例如当前用户等)的一个。其他的仅包含堆栈跟踪,该跟踪已经包含在我们自己的格式化电子邮件中。

我们无法确定这些其他日志消息来自哪里;但我能想到的最有可能的是,在微软的库中,它们正在调用_logger.LogError(),而我们自己的 NLog 配置正在处理 ; 的所有实例LogError。而不是只处理我们自己的事情。

我们如何防止这些其他日志语句被记录,特别是通过电子邮件发送给我们?

这是我们在 Program.cs 中的设置:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                    WebHost.CreateDefaultBuilder(args)
                        .UseStartup<Startup>()
                         .ConfigureLogging(logging =>
                         {
                             logging.ClearProviders();
                             logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                         })
                    .UseNLog();
Run Code Online (Sandbox Code Playgroud)

Jul*_*ian 6

您可以在 .NET Core 中过滤此内容 - 因为您使用 Microsoft.Extensions.Logging 集成,并且 Microsoft 将消息发送到该集成 - 以及在 NLog 中。

在 .NET Core 中配置

修改您的配置,例如appsettings.json。例如,对于所有 Microsoft.* 至少有一个错误,对于 Microsoft.EntityFrameworkCore.* 至少有一个警告

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Error",
      "Microsoft.EntityFrameworkCore": "Warning"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是 NLog 特定的,因此您不能使用 NLog 级别名称。可能的级别名称

请在此处阅读有关此方法的更多信息。

配置NLog

或者您可以在 NLog 配置中进行配置。

在 NLog.config 中,编辑<rules>。这些规则是从上到下处理的。

  • 您可以使用属性过滤名称空间name*允许)
  • 如果没有writeTo属性,日志将被丢弃
  • 如果一条规则已final="true"匹配事件,则不会处理下一条规则。

例如:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Error",
      "Microsoft.EntityFrameworkCore": "Warning"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关 nlog.config 规则的信息。

这也可以通过代码中的相同方法实现,请参见此处