Integración de Logging en Aplicaciones de Consola .NET Core

La gestión de la entrada de registros en proyectos .NET Core se realiza mediante la inyección de dependencias. Si bien esto es automático en aplicacoines ASP.NET al crear un nuevo proyecto con Startup.cs, las aplicaciones de consola requieren una configuración manual para habilitar esta funcionalidad.

A continuación, se detalla el proceso de configuración, adaptando la información de una publicación de blog existente. Se asume el uso de Visual Studio 2019.

Dependencias Necesarias

El archivo del proyecto (.csproj) debe incluir los siguientse paquetes:


<ItemGroup>
   <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.0" />
   <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
   <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
   <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
   <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
   <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.0" />
   <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
</ItemGroup>
   

Configuración de Logging

La lógica de negocio se implementará en servicios, mientras que Program.cs se encargará de la orquestación inicial. Es necesario definir la configuración de logging en el archivo appsettings.json.

appsettings.json


{
 "Logging": {
   "LogLevel": {
     "Default": "Debug",
     "System": "Information",
     "Microsoft": "Information"
   },
   "Console": {
     "IncludeScopes": true
   }
 }
}
   

Program.cs

En Program.cs, se inicializa la colección de servicios, se configura el logging y se construye el proveedor de servicios.


using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.IO;

public class Program
{
   public static void Main(string[] args)
   {
       var serviceCollection = new ServiceCollection();
       ConfigureServices(serviceCollection);
       var serviceProvider = serviceCollection.BuildServiceProvider();

       var appInstance = serviceProvider.GetService<ApplicationLogic>();
       if (appInstance != null)
       {
           appInstance.Execute();
       }
       else
       {
           System.Console.WriteLine("Error: No se pudo inicializar la aplicación.");
       }
   }

   private static void ConfigureServices(IServiceCollection services)
   {
       var configuration = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", optional: false)
           .Build();

       services.AddLogging(loggingBuilder =>
       {
           loggingBuilder.AddConfiguration(configuration.GetSection("Logging"));
           loggingBuilder.AddConsole();
           loggingBuilder.AddDebug();
       });

       // Registrar la configuración genérica IConfigurationRoot
       services.AddSingleton(configuration);

       // Registrar servicios de negocio
       services.AddTransient<IProcessingTask, DataProcessor>();

       // Registrar la clase principal de la aplicación
       services.AddTransient<ApplicationLogic>();
   }
}
   

ApplicationLogic.cs

Esta clase encapsula la lógica principal de la aplicación, utilizando los servicios inyectados.


using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;

public class ApplicationLogic
{
   private readonly IProcessingTask _taskProcessor;
   private readonly ILogger<ApplicationLogic> _logger;
   private readonly IConfigurationRoot _appConfig;

   public ApplicationLogic(ILogger<ApplicationLogic> logger, IProcessingTask taskProcessor, IConfigurationRoot config)
   {
       _logger = logger;
       _taskProcessor = taskProcessor;
       _appConfig = config;
   }

   public void Execute()
   {
       _logger.LogInformation("Iniciando la ejecución de la aplicación.");
       _taskProcessor.PerformAction();
       System.Console.WriteLine("Presione una tecla para salir...");
       System.Console.ReadKey();
   }
}
   

DataProcessor.cs

Un ejemplo de servicio que puede ser inyectado y utilizado por la lógica de la aplicación.


using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;

public interface IProcessingTask
{
   void PerformAction();
}

public class DataProcessor : IProcessingTask
{
   private readonly ILogger<DataProcessor> _logger;
   private readonly IConfigurationRoot _appConfig;

   public DataProcessor(ILogger<DataProcessor> logger, IConfigurationRoot config)
   {
       _logger = logger;
       _appConfig = config;
   }

   public void PerformAction()
   {
       _logger.LogDebug("Ejecutando el procesador de datos.");
       // Lógica de procesamiento de datos aquí
   }
}
   

Etiquetas: dotnet core logging Console Application dependency injection configuration

Publicado el 6-13 02:09