Service Collection
Esta extensión proporciona métodos para configurar e integrar un sistema de logging robusto y flexible en aplicaciones .NET, utilizando Serilog y OpenTelemetry. Facilita la adición de servicios de logging al contenedor de inyección de dependencias y la configuración de Serilog para enriquecer los logs con información útil y exportarlos a sistemas de telemetría.
Dependencias y Requisitos Previos
Microsoft.Extensions.DependencyInjection
: Necesario para la interfazIServiceCollection
.Microsoft.Extensions.Configuration
: Necesario para la interfazIConfiguration
.Microsoft.Extensions.Options
: Necesario para la configuración de opciones.Serilog
: Librería para logging estructurado.Serilog.Sinks.OpenTelemetry
: Sink de Serilog para exportar logs a OpenTelemetry.Serilog.Exceptions
: Librería para enriquecer logs con detalles de excepciones.Microsoft.EntityFrameworkCore
: Necesario para la el enriquecedor de excepcionesDbUpdateExceptionDestructurer
(opcional).OpenTelemetry.Proto
: Necesario para trabajar con OpenTelemetry.
Escenarios de uso
Este método de extensión es particularmente útil en aplicaciones que:
- Necesitan un sistema de logging centralizado y configurable.
- Requieran enriquecer los logs con información contextual (como nombre de la app, versión, etc.).
- Deban exportar logs a sistemas de telemetría como OpenTelemetry para monitoreo y análisis.
- Deseen usar Serilog como proveedor de logging por su flexibilidad y funcionalidades.
- Quieran manejar excepciones de manera detallada en los logs.
Beneficios
- Configuración centralizada: Facilita la configuración de logging desde una única sección de configuración.
- Enriquecimiento de logs: Permite agregar información contextual valiosa a los logs, como nombre de la app, versión, máquina, usuario, etc.
- Integración con OpenTelemetry: Permite exportar los logs a sistemas de telemetría para monitoreo y análisis.
- Manejo detallado de excepciones: Captura y registra información detallada de excepciones, incluyendo la pila de llamadas y propiedades relevantes.
- Flexibilidad: Permite personalizar la configuración de Serilog mediante un delegado opcional.
- Código limpio: Simplifica la configuración y uso de Serilog al extender directamente la interfaz
IServiceCollection
yIHostBuilder
Ejemplo Práctico
Supongamos que tienes una aplicación de consola .NET Core y deseas configurar un sistema de logging con Serilog y OpenTelemetry. A continuación, se muestra un ejemplo de cómo usar la extensión ServiceCollectionExtension
para configurar los servicios de logging y Serilog en tu aplicación:
// See https://aka.ms/new-console-template for more information
using CodeDesignPlus.Net.Logger.Extensions;using CodeDesignPlus.Net.Logger.Sample;
var builder = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); config.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); }) .ConfigureServices((context, services) => { services.AddLogging(); services.AddLogger(context.Configuration);
services.AddHostedService<FakeBackgroundService>(); }) .UseSerilog();
var host = builder.Build();
host.Run();
Métodos de extensión
La extensión ServiceCollectionExtension
proporciona los siguientes métodos de extensión para configurar e integrar un sistema de logging en aplicaciones .NET:
AddLogger
Type: public static IServiceCollection AddLogger(this IServiceCollection services, IConfiguration configuration)
Este método añade los servicios de logging al contenedor de inyección de dependencias. Lee la configuración de la sección especificada en LoggerOptions.Section
, la valida y la vincula a la clase LoggerOptions
. Tambien, adiciona los servicios core del proyecto con el método AddCore
.
-
Parámetros
services
: ElIServiceCollection
al que se añadirán los servicios de logging.configuration
: ElIConfiguration
que se utilizará para configurar las opciones del logger.
-
Tipo de retorno
IServiceCollection
: ElIServiceCollection
modificado, lo que permite encadenar llamadas adicionales.
-
Excepciones
ArgumentNullException
: Se lanza siservices
oconfiguration
son nulos.Exceptions.LoggerException
: Se lanza si la secciónLoggerOptions.Section
no se encuentra en la configuración.
-
Ejemplo de uso
using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Configuration;using CodeDesignPlus.Net.Logger.Extensions;// Suponiendo que tienes una variable 'services' de tipo IServiceCollection// y una variable 'configuration' de tipo IConfigurationservices.AddLogger(configuration);
UseSerilog
Type: public static IHostBuilder UseSerilog(this IHostBuilder builder, Action<LoggerConfiguration> configureLogger = null)
Este método configura Serilog para usarlo como proveedor de logging, leyendo su configuración del appsettings.json
. Enriquerce los logs con diferentes propiedades como, nombre de la aplicación, versión, máquina, id del proceso, etc, adicionalmente configura el OpenTelemetry
cuando es requerido. Permite personalizar la configuración de Serilog a través de la acción configureLogger
.
-
Parámetros
builder
: ElIHostBuilder
que se configurará.configureLogger
: Una acción opcional que permite personalizar la configuración deLoggerConfiguration
.
-
Tipo de retorno
IHostBuilder
: ElIHostBuilder
modificado, lo que permite encadenar llamadas adicionales.
-
Excepciones
ArgumentNullException
: Se lanza sibuilder
es nulo.
-
Ejemplo de uso
using Microsoft.Extensions.Hosting;using CodeDesignPlus.Net.Logger.Extensions;using Serilog;// Suponiendo que tienes una variable 'builder' de tipo IHostBuilderbuilder.UseSerilog((config) => {// Configuraciones adicionales de Serilog aquíconfig.MinimumLevel.Information();});
Conclusiones
La extensión ServiceCollectionExtension
proporciona una forma conveniente y robusta de configurar e integrar un sistema de logging con Serilog y OpenTelemetry en aplicaciones .NET. Facilita la configuración, el enriquecimiento de logs y la exportación a sistemas de telemetría, permitiendo a los desarrolladores enfocarse en la lógica del negocio en lugar de la configuración del logging.