Microsoft.Extensions.Logging Vs. NLog

With NLog you could do:

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

That works for all platforms and all frameworks.

Microsoft.Extensions.Logging

With .NET Core, Microsoft introduced the ILogger abstraction from Microsoft.Extensions.Logging. You could use that logging abstraction in your project and integrate it with NLog.

For example in ASP.NET Core you could inject Microsoft.Extensions.Logging.ILogger<HomeController> and that could send the logs to NLog. (see 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();
    }

Packages

For NLog and Microsoft.Extensions.Logging there are the following packages:

Comparison

NLog Pros

Pros of using NLog directly

  • Best performance
  • More options with the logger API, e.g. Logger.WithProperty(..)
  • Works in all platforms
  • No Dependency Injection needed which saves complexity.

Pros Microsoft.Extensions.Logging

Pros of using NLog via Microsoft.Extensions.Logging:

  • Fully integrated with ASP.NET Core, e.g. Microsoft also writes to the logger API and that will be also captured (and possible filtered) by NLog
  • Writing to the logging abstraction will make your code log-library independent.
  • Works well with .NET Core Dependency injection
  • new: You could configure NLog with appsettings.json – so with JSON instead of XML

Update: added – Using NLog with appsettings.json

Leave a Comment