如何防止 NLog 处理引用库中的日志语句?
How can you prevent NLog from handling log statements in referenced libraries?
每当我们的 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();
您可以在 .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。
每当我们的 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();
您可以在 .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。