ASP .NET Core - Fazendo o Logging com o NLog


Hoje veremos como fazer a integração do NLog com uma aplicação ASP .NET .Core MVC.

Em aplicativos do mundo real, um mecanismo de registro de erros adequado é essencial para rastrear e solucionar o comportamento inesperado da aplicação.

Na Asp.Net Core, temos uma API de Log embutida que está incluída no namespace Microsoft.Extensions.Logging e que eu já mostrei como usar em outros artigos.

Com esta API, podemos registrar informações em diferentes provedores de registro integrados, como Console, Debug, EventListener, TraceListeners etc. Para estender o número de provedores, a Microsoft também colaborou com vários provedores de registro de terceiros, como NLog, Serilog, Loggr, Log4Net e alguns outras.

Neste artigo, vamos explorar a integração da Asp.Net Core com o NLog, um dos mais populares provedores de registro de log de terceiros. Veja a página do projeto NLog aqui: NLog

Vamos criar uma aplicação ASP .NET Core MVC padrão usando o VS 2019 Community na versão do .NET Core 3.1 e mostrar como integrar o NLog para fazer o registro de log em arquivos texto.

Para isso vamos usar o pacote NLog.Web.AspNetCore via Nuget e realizar a configuração e a integração deste provedor com o logging na ASP.NET Core.

Criando o projeto inicial no VS 2019

Abra o VS 2019 Community e crie um novo projeto via menu File-> New Project;

Selecione o template ASP .NET Core Web Application, e, Informe o nome da solução Aspnc_NLog e o nome do projeto FuncionariosWeb.

A seguir selecione .NET Core e ASP .NET Core 3.1 e marque o template Web Application e as configurações conforme figura abaixo:

Observe que não vamos definir agora a autenticação em nosso projeto vamos fazer isso depois.

Depois que o projeto foi criado, precisamos adicionar a referência ao pacote:

Nota Para instalar use o comando Install-Package <nome> -version 4.9.3

Pronto com isso já podemos integrar o NLog ao nosso projeto.

Criando o arquivo de configuração NLog

Vamos criar um arquivo texto na raiz do projeto com o nome de nlog.config :

A seguir vamos definir algumas configurações que serão usadas em nosso projeto para realizar o logging.

Inclua no arquivo nlog.config o código abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<!-- the targets to write -->
	<targets>
		<!-- write to file -->
		<target name="macnetlog" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log"
		layout="${longdate} ${uppercase:${level}} - ${message} - ${exception:format=StackTrace}${newline}" />
	</targets>
	<!-- rules to map from logger name to target -->
	<rules>
		<!-- all logs including Microsoft -->
		<logger name="*" minlevel="Trace" writeTo="macnetlog" />
	</rules>
</nlog>

A configuração do NLog é formatada como XML e é incorporada a um arquivo de configuração de projeto do Visual Studio (app.config ou web.config) ou é um arquivo XML autônomo.

Aqui destacamos as seções:

<targets> - Onde definimos o nome e caminho do arquivo de log e formatamos como a mensagem será gravada

<rules> - Onde definimos as regras para o logging

Para mais detalhes de configuração consulte a documentação no Github.

Lembrando que no momento do build, este arquivo de configuração deve ser copiado para o diretório de saída. Para fazer isso, clique com o botão direito sobre o arquivo nlog.config e na janela Propriedades, na seção “Advanced”, vá para a propriedade e define o valor de Copy to Output Directory como : copy if newer.

Adicionando o provedor NLog

Para adicionar NLog como um dos provedores de log, precisamos modificar o método CreateHostBuilder no arquivo Program.cs. O código abaixo mostra como habilitar o provedor de registro NLog:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
namespace MacorattiNet.Web
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>()
                      .ConfigureLogging((hostingContext, logging) =>
                      {
                          logging.AddNLog(hostingContext.Configuration.GetSection("Logging"));
                      });
                });
    }
}

Observe que os níveis de registro serão aplicados com base na configuração de registro fornecida no arquivo appsettings.json.

Abaixo está a configuração de log padrão que o Visual Studio cria no arquivo appsettings.json ao criar um novo projeto. Você pode alterar os níveis de registro de acordo com sua necessidade.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Se você precisa usar uma configuração avançada de nível de registro, visite a página oficial da Microsoft.

Com isso, concluímos a integração do NLog com nossa aplicação. Vamos testar o provedor de log NLog lançando uma exceção.

Testando o provedor NLog

Para testar o provedor NLog, estamos usando a API do Microsoft Logging que ja está incluída no pacote Microsoft.Extensions.Logging, que já foi adicionado ao modelo da aplicação Asp.Net Core.

Vamos usar o controlador HomeController onde  já  estamos usando a interface ILogger para registrar os erros e definir o código abaixo onde no método Action Privacy definimos um código que vai causar uma exceção:

using Aspnc_NLog.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
namespace Aspnc_NLog.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
        public IActionResult  Privacy()
        {
            try
            {
                int numero = 100;
                var resultado = numero / Convert.ToInt32("0");
            }
            catch (Exception ex)
            {
                _logger.LogInformation($"Testando o NLog em {DateTime.UtcNow}");
                _logger.LogWarning("NLog - Alerta");
                _logger.Log(LogLevel.Error, ex, ex.Message);
            }
            return View();
        }
        public IActionResult Index(){...}
        ... 
    }
}

NotaA interface ILogger já está disponível no contêiner de dependência do aplicativo porque o construtor WebHost está adicionando o serviço Logging ao contêiner de dependência junto com outros serviços necessários.

Aqui estamos gravando o registro de erro definindo uma informação e um alerta, e, o erro que serão gravados no arquivo de log gerado dentro da pasta logs na pasta bin/debug/netcoreapp3.1 do projeto:

Executando o projeto, clicando no link Privacy e a seguir abrindo a pasta:

D:\_aspncore\_aspnc_10\Aspnc_NLog\Aspnc_NLog\bin\Debug\netcoreapp3.1\logs

que é a localização no meu projeto, veremos o arquivo texto 2020-11-08.text gerado conforme abaixo:

Abrindo o arquivo texto teremos o log gerado:

Vimos assim como  é simples usar o NLog e integrá-lo com a ASP .NET Core MVC.

Pegue o projeto aqui: Aspnc_NLog.zip  (sem as referências)

(Disse Jesus)"Eu sou a videira verdadeira, e meu Pai é o lavrador. Toda a vara em mim, que não dá fruto, a tira; e limpa toda aquela que dá fruto, para que dê mais fruto."
João 15:1,2

Referências:


José Carlos Macoratti