【问题标题】:NLog, .net core: How to get access to a specific logger in my service through dependency injectionNLog,.net 核心:如何通过依赖注入访问我的服务中的特定记录器
【发布时间】:2021-03-19 23:10:19
【问题描述】:

软件版本:

  • .NET Core v5.0
  • NLog v4.7.6
  • Microsoft 扩展日志记录 v5
  • VisualStudio2019

我在我的 .net 核心控制台应用程序中使用 NLog 和 Microsoft 日志记录扩展。

该应用程序包含多个作为托管服务在后台运行的服务。

每个服务都可以通过通常的依赖注入访问其构造函数中设置的类型化记录器。但我还需要添加对特殊电子邮件记录器的访问权限,该记录器将发送有关严重异常的电子邮件。有没有其他方法可以将一个特殊的记录器注入到我的服务中,而不是在每个服务中从“NLog.LogManager.GetLogger()”创建它?

    public class TestService: IHostedService
    {
        private readonly ILogger<TestService> _logger;
        private readonly ILogger _emailOnFatalError;

        public TestService(ILogger<TestService> logger)
        {
            _logger = logger;
            //_emailOnFatalError = (ILogger) NLog.LogManager.GetLogger("emailOnFatalError");
        }
    }

【问题讨论】:

  • 我记得,您可以将不同的日志级别路由到 NLog 中的不同记录器源,因此只需配置将致命日志级别发送到电子邮件,并将所有其他日志级别发送到文件。所以 _logger.LogFatal 将被发送到电子邮件,_logger.LogInformation - 到文件
  • @IvanKhorin,是的,这是可能的,但我不想将所有致命日志消息发送到电子邮件,只发送需要开发团队立即关注的一小部分。
  • 好的,使用带有“when”语句的过滤器,例如&lt;when condition="contains('${message}','URGENT!!!:')" action="Ignore" /&gt;,并且只使用模式来发送非常紧急的消息。第二个想法是调用 NLog.LogManager.GetLogger("emailOnFatalError");例如,在配置部分并将结果注入为 Singleton。

标签: c# .net-core dependency-injection nlog


【解决方案1】:

不要将 ILogger 作为构造函数参数,而是使用 ILoggerFactory:

public class TestService: IHostedService
{
    private readonly ILogger _logger;
    private readonly ILogger _emailOnFatalError;

    public TestService(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger(GetType().ToString());
        _emailOnFatalError = loggerFactory.CreateLogger("emailOnFatalError");
    }
}

或者考虑添加这样的事件属性:

_logger.LogError("Something awful - {EmailAlert}", "Important");

然后您可以使用NLog filtering 仅发送包含${event-property:EmailAlert} 的日志事件:

<logger name="*" writeTo="emailOnFatalError" minLevel="Error">
   <filters defaultAction="Log">
      <when condition="'${event-property:EmailAlert}' == ''" action="Ignore" />
   </filters>
 </logger> 

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 2018-12-14
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多