如何将 NLog 目标与 Microsoft ILogger 过滤器结合使用?

Posted

技术标签:

【中文标题】如何将 NLog 目标与 Microsoft ILogger 过滤器结合使用?【英文标题】:How to combine NLog Targets with Microsoft ILogger filters? 【发布时间】:2022-01-15 08:19:14 【问题描述】:

我们在 .net 5.0 Web API 中使用 NLog,感觉日志级别设置在多个位置。有没有办法我们可以配置 nLog 以使用应用设置并忽略 nLog.config 日志级别?

nlog.config

<rules>
    <logger name="*" levels="Trace,Debug,Info,Warn,Error,Fatal" writeTo="NLogTarget"/>
</rules>

AppSettings.json:

"Logging": 
    "LogLevel": 
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Debug"
    

提前致谢。

【问题讨论】:

您使用的是哪个版本的 NLog?注意 NLog 4 在 appsettings 中始终遵循 Microsoft LoggerFactory-config。 NLog 5 默认会忽略 MIcrosoft LoggerFactory-config,除非明确指定 NLogProviderOptions.RemoveLoggerFactoryFilter = false NLog 版本为 4.7.8。 您是仅使用 Microsoft ILogger-object 还是直接使用 NLog Logger-object ? (例如NLog.LogManager.GetCurrentClassLogger() 要直接禁用日志信息吗? @RolfKristensen 我们正在使用 Microsoft ILogger 进行日志记录。 【参考方案1】:

如果只使用 Microsoft ILogger,那么您可以在 NLog 中使用它(并依赖 Microsoft LoggerFactory 从 appsettings.json 过滤):

<rules>
    <logger name="*" writeTo="NLogTarget"/>
</rules>

升级到 NLog 5.0 时请注意,然后记得在 AddNLogUseNLog 上配置 NLogProviderOptions.RemoveLoggerFactoryFilter = false(如果使用最新的 NLog,则该设置已经存在,因此您现在可以预先设置)。

大多数用户对拥有 2 个日志过滤系统感到困惑,并期望在使用 NLog 时应用的是 NLog 过滤器。因此将其更改为默认忽略 Microsoft LoggerFactory 过滤器。

请注意,您还可以在 appsettings.json 中拥有 NLog 配置。另见https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-configuration-with-appsettings.json

【讨论】:

谢谢,它有效。

以上是关于如何将 NLog 目标与 Microsoft ILogger 过滤器结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

.Net -- NLog日志框架配置与使用

IL指令集

IL指令详细

IL指令详细表

IL-rewriting profiler

解析 nlog.config 时出现 NLog 异常 - 找不到目标:'EventLog'