Microsoft.Extensions.Logging 对比。日志

Ale*_*erl 22 logging nlog microsoft-extensions-logging

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

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

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

Jul*_*ian 26

使用 NLog,您可以:

var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("Hello {Name}", "Earth");
Run Code Online (Sandbox Code Playgroud)

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

Microsoft.Extensions.Logging

随着 .NET Core 的引入,Microsoft 引入了日志抽象 - Microsoft.Extensions.Logging。您可以在项目中使用该日志抽象并将其与 NLog 集成。

例如,在 ASP.NET Core 中,您可以注入Microsoft.Extensions.Logging.ILogger<HomeController>并将日志发送到 NLog。(请参阅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();
    }
Run Code Online (Sandbox Code Playgroud)

套餐

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

比较

NLog 优点

直接使用 NLog 的优点

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

优点 Microsoft.Extensions.Logging

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

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

更新:添加 -在 appsettings.json 中使用 NLog

  • NLog 的另一个优点:API 简洁,更容易编写。例如 `log.Info(...)` 而不是 `logger.LogInformation(...)`。可以说,您可以创建扩展方法来克服这个问题,但最好将其开箱即用。 (4认同)
  • @TimurVafin 是的,但有时,拥有一个惯用的 API 比使用冗长的 API 更好。一旦你习惯了它,它就会自洽,不会让你感到惊讶,而且你会变得更有效率。一个完美的例子是像 `Where`、`Select` 这样的 Linq 扩展方法,它们本身根本没有描述性,但在 Linq 的上下文中,它们非常有意义。我认为这也是日志记录背景下的一个例子。 (2认同)