【问题标题】:Microsoft.Extensions.Logging Vs. NLogMicrosoft.Extensions.Logging 与。日志
【发布时间】:2020-02-01 04:18:15
【问题描述】:

我看到很多帖子都提到了 Microsoft.Extensions.Logging 和 NLog 的使用。

我想更好地了解 Microsoft.Extensions.Logging 的用途?

特别是为什么需要它或者将它与 NLog 一起使用有什么好处?

【问题讨论】:

  • Microsoft AspNetCore-engine 只会记录到 Microsoft-Extension-Logging (MEL)。如果您想监视/诊断该引擎的问题,例如 NLog。然后您可以注册 NLog 成为 MEL-LoggingProvider。此外,Microsoft Dependency-Injection 默认情况下会自动提供其自己的 MEL-ILogger-instances 作为构造函数参数。

标签: logging nlog microsoft-extensions-logging


【解决方案1】:

使用 NLog 你可以做到:

var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("Hello {Name}", "Earth");

这适用于所有平台和所有框架。

Microsoft.Extensions.Logging

在 .NET Core 中,Microsoft 引入了来自 Microsoft.Extensions.Logging 的 ILogger abstraction。您可以在项目中使用该日志记录抽象并将其与 NLog 集成。

例如,在 ASP.NET Core 中,您可以注入 Microsoft.Extensions.Logging.ILogger<HomeController>,这可以将日志发送到 NLog。 (见Getting started with ASP.NET Core 2 · NLog/NLog Wiki

using Microsoft.Extensions.Logging;

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogInformation("Index page says hello {Name}", "Universe");
        return View();
    }

对于 NLog 和 Microsoft.Extensions.Logging 有以下软件包:

比较

NLog 专业人士

直接使用 NLog 的优点

  • 最佳性能
  • 记录器 API 的更多选项,例如Logger.WithProperty(..)
  • 适用于所有平台
  • 无需依赖注入,从而节省复杂性。

优点 Microsoft.Extensions.Logging

通过 Microsoft.Extensions.Logging 使用 NLog 的优点:

  • 与 ASP.NET Core 完全集成,例如Microsoft 还会写入记录器 API,NLog 也会捕获(并可能过滤)这些内容
  • 写入日志抽象将使您的代码日志库独立。
  • 适用于 .NET Core 依赖注入
  • :您可以configure NLog with appsettings.json - 所以使用 JSON 而不是 XML

更新:添加 - Using NLog with appsettings.json

【讨论】:

  • NLog 的另一个优点:API 简洁且易于编写。例如log.Info(...) 而不是 logger.LogInformation(...)。可以说,您可以创建扩展方法来克服这个问题,但开箱即用是很好的。
【解决方案2】:

Microsoft.Extensions.Logging 用于依赖注入,这对于单元测试很方便:你可以实现一个带有 LoggedText 属性的记录器来支持Assert.IsTrue(_logger.LoggedText.Contains("expected value"))。下面的例子说明了这样一个类,它实现了Microsoft.Extensions.Logging.ILogger&lt;T&gt;,并且(为了好玩)也使用了 Julian 的建议,将消息发送到 NLog:

using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
    
namespace MyDomain.Tests
{
   internal class WrappedNLogger<T> : ILogger<T>
    {
       private StringBuilder _sb = new StringBuilder(); //Support Assert.IsTrue(_logger.LoggedText == "expected value")
        private NLog.Logger _nlog = NLog.LogManager.GetCurrentClassLogger(); //support use of NLog

        public IDisposable BeginScope<TState>(TState state) => default;

        public bool IsEnabled(LogLevel logLevel) => true;

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            var jsonLine = JsonConvert.SerializeObject(new
            {
                timestamp = DateTime.Now.ToLongTimeString(),
                logLevel,
                eventId,
                parameters = (state as IEnumerable<KeyValuePair<string, object>>)?.ToDictionary(i => i.Key, i => i.Value),
                message = formatter(state, exception),
                exception = exception?.GetType().Name
            });

            _sb.AppendLine(jsonLine);
            NLog.LogLevel nloglevel = logLevel == LogLevel.Debug ? NLog.LogLevel.Debug
                                    : logLevel == LogLevel.Information ? NLog.LogLevel.Info
                                    : logLevel == LogLevel.Warning ? NLog.LogLevel.Warn
                                    : logLevel == LogLevel.Error ? NLog.LogLevel.Error
                                    : logLevel == LogLevel.Critical ? NLog.LogLevel.Fatal : NLog.LogLevel.Trace;
            _nlog.Log(nloglevel, jsonLine);
        }

        public string LoggedText { get => _sb.ToString(); }
           
    }
}

【讨论】:

  • 这违背了 Logger 应该与输出格式无关的想法。考虑使用 NLog.Extensions.Logging 和 LoggerFactory,然后使用 JsonLayout 配置 NLog 目标会是更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2018-02-27
相关资源
最近更新 更多