Implementación de Registro de Eventos con NLog en Aplicaciones ASP.NET Core

NLog es una robusta y flexible biblioteca de código abierto diseñada para el registro de eventos en plataformas .NET. Permite a los desarrolladores integrar capacidades avanzadas de diagnóstico y trazabilidad en sus aplicaciones, capturando información contextual y dirigiéndola a diversos destinos de salida configurables.

Una de las características destacadas de NLog es su facilidad de configuración. A diferencia de otras soluciones de registro que emplean configuraciones jerárquicas, NLog utiliza un sistema de tablas de enrutamiento que simplifica la lectura y el mantenimiento de los archivos de configuración, haciendo el proceso más intuitivo para los equipos de desarrollo.

Inicio de la Implementación

1. Crear un Proyecto ASP.NET Core

Comience creando una nueva aplicación web ASP.NET Core. Puede usar la plantilla de "Aplicación web (Modelo-Vista-Controlador)" o "API web" según sus necesidades.

2. Instalar el Paquete NLog.Web.AspNetCore

Para integrar NLog con su aplicación ASP.NET Core, necesita añadir el paquete NuGet NLog.Web.AspNetCore. Esto se puede hacer a través del Administrador de Paquetes NuGet en Visual Studio o mediante la línea de comandos de .NET CLI:

dotnet add package NLog.Web.AspNetCore

3. Configurar NLog con nlog.config

Cree un archivo llamado nlog.config en el directorio raíz de su proyecto. Este archivo contendrá las reglas y destinos para el registro de eventos. Asegúrese de que sus propiedades en Visual Studio (o el archivo .csproj) estén configuradas para que este archivo se copie al directorio de salida (Copy to Output Directory: Copy if newer).

<?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"
     autoReload="true"
     internalLogLevel="Warn"
     internalLogFile="logs/nlog-interno.txt">

 <!-- Carga las extensiones de NLog para ASP.NET Core -->
 <extensions>
   <add assembly="NLog.Web.AspNetCore"/>
 </extensions>

 <!-- Destinos de salida para los registros -->
 <targets>
   <!-- Un archivo de registro que captura todos los eventos -->
   <target xsi:type="File" name="bitacoraGeneral" fileName="logs/registro-completo-${shortdate}.log"
           layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" />

   <!-- Otro archivo de registro, enfocado en eventos de la aplicación, ignorando los de Microsoft -->
   <target xsi:type="File" name="bitacoraAplicacion" fileName="logs/registro-aplicacion-${shortdate}.log"
           layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}|url: ${aspnet-request-url}|accion: ${aspnet-mvc-action}" />

   <!-- Un destino nulo para descartar logs específicos -->
   <target xsi:type="Null" name="descarte" />
 </targets>

 <!-- Reglas para enrutar los registros a los destinos -->
 <rules>
   <!-- Enviar todos los registros a la bitacoraGeneral -->
   <logger name="*" minlevel="Trace" writeTo="bitacoraGeneral" />

   <!-- Descartar todos los registros provenientes de los componentes de Microsoft -->
   <logger name="Microsoft.*" minlevel="Trace" writeTo="descarte" final="true" />
   <!-- Enviar el resto de los registros a la bitacoraAplicacion -->
   <logger name="*" minlevel="Trace" writeTo="bitacoraAplicacion" />
 </rules>
</nlog>

4. Configurar NLog en Startup.cs

Modifique el archivo Startup.cs para inicializar NLog y integrarlo con el sistema de registro de ASP.NET Core y su pipeline de soilcitudes HTTP.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using NLog.Web;

namespace AplicacionRegistroEventos
{
   public class Startup
   {
       public IConfiguration ConfiguracionApp { get; }

       public Startup(IConfiguration config, IWebHostEnvironment entornoWeb)
       {
           ConfiguracionApp = config;
           // Configura NLog cargando el archivo nlog.config.
           // Es crucial que 'nlog.config' esté configurado para copiarse al directorio de salida.
           entornoWeb.ConfigureNLog("nlog.config");
       }

       // Este método se invoca en tiempo de ejecución. Añade servicios al contenedor de DI.
       public void ConfigureServices(IServiceCollection servicios)
       {
           servicios.AddControllersWithViews(); // Preferible a AddMvc() en versiones recientes
       }

       // Este método se invoca en tiempo de ejecución. Configura el pipeline de solicitudes HTTP.
       public void Configure(IApplicationBuilder aplicacion, IWebHostEnvironment entornoWeb, ILoggerFactory fabricaRegistrador)
       {
           // Integra NLog como proveedor de ILogger para el sistema de logging de .NET Core.
           fabricaRegistrador.AddNLog();
           // Añade el middleware de NLog para capturar información específica de ASP.NET Core (ej. URL, acciones MVC).
           aplicacion.AddNLogWeb();

           if (entornoWeb.IsDevelopment())
           {
               aplicacion.UseDeveloperExceptionPage();
           }
           else
           {
               aplicacion.UseExceptionHandler("/Inicio/Error");
               aplicacion.UseHsts(); // Recomendado para entornos de producción
           }

           aplicacion.UseHttpsRedirection(); // Recomendado para entornos de producción
           aplicacion.UseStaticFiles();
           aplicacion.UseRouting(); // Esencial para el enrutamiento MVC moderno
           aplicacion.UseAuthorization(); // Esencial para la autorización MVC moderna

           aplicacion.UseEndpoints(puntosFinales => // Forma moderna de configurar rutas de endpoints
           {
               puntosFinales.MapControllerRoute(
                   name: "defecto",
                   pattern: "{controller=Inicio}/{action=Principal}/{id?}");
           });
       }
   }
}

5. Registrar Eventos desde un Controlador

Para registrar eventos en su aplicación, inyecte una instancia de ILogger<T> en el constructor de su controlador. NLog se encargará de procesar estos registros según su configuración.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace AplicacionRegistroEventos.Controllers
{
   public class InicioController : Controller
   {
       private readonly ILogger<InicioController> _registradorEventos;

       public InicioController(ILogger<InicioController> registrador)
       {
           _registradorEventos = registrador;
       }

       public IActionResult Principal()
       {
           _registradorEventos.LogInformation("Accediendo a la página principal de la aplicación.");
           return View();
       }

       public IActionResult Contacto()
       {
           _registradorEventos.LogWarning("Se ha visitado la página de contacto.");
           return View();
       }
   }
}

Etiquetas: NLog ASP.NET Core C# RegistroEventos nuget

Publicado el 10-11 19:03