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

How can you prevent NLog from handling log statements in referenced libraries?

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

例如,当数据库超时时,我们看到来自这些不同 类:

的 4 封电子邮件

最后一个是唯一一个有我们自己的错误格式的,里面有有用的信息,比如当前用户等。其他的只包含一个堆栈跟踪,它已经在我们自己格式化的电子邮件中。

我们无法确定这些其他日志消息的来源;但我最有可能想到的是,在微软的库中,他们正在调用 _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();

您可以在 .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"
    }
  }
}

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

详细了解此方法 here

配置 NLog

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

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

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

例如:

<rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Info" final="true" /> <!-- BlackHole without writeTo -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>

您可以阅读 nlog.config 规则 here

这也可以通过代码中的相同方法实现,请参阅 here