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



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

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

  • 微软。AspNetCore。诊断。异常处理程序中间件
  • 微软。EntityFrameworkCore。数据库命令
  • 微软。EntityFrameworkCore。查询
  • Web。控制器。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();

您可以在中进行筛选。NET核心-因为您使用的是Microsoft。扩展。日志集成和Microsoft将消息发送到该日志以及NLog中。

在中配置。NET核心

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

{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"Microsoft": "Error",
"Microsoft.EntityFrameworkCore": "Warning"
}
}
}

注意,这不是特定于NLog的,所以您不能使用NLog级别的名称。可能的级别名称

点击此处了解有关此方法的更多信息。

配置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规则。

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

最新更新