Dinaup.Logs

Dinaup.Logs para .NET: guía de inicio, buenas prácticas y ejemplos

Dinaup.Logs es el módulo de observabilidad de la librería Dinaup que unifica logs, correlación y métricas en tus aplicaciones .NET. Con pocas líneas consigues

  • Logs estructurados con contexto (Component, Action).

  • Correlación distribuida (CorrelationId) para rastrear un flujo entre servicios.

  • Métricas listas para exportar (counters e histogramas) y envío opcional a OpenSearch.

  • Helpers para envolver código con medición de tiempo, manejo de errores y logs coherentes.

Requisitos

Dinaup .NET

Antes de empezar necesitarás instalar el paquete Dinaup.

OpenSearch gestionado (recomendado): OVHcloud Para centralizar y consultar tus logs y métricas, recomendamos contratar OpenSearch gestionado de OVHcloud.

Inicio


var openSearchConfig = new Logs.OpenSearchConfig
{
    Endpoint = "***",
    Username =  "***",
    Password =  "***"
};

Logs.Initialize(
    applicationName: "MiApp",
    applicationVersion: "1.0.0",
    logFilePath: "logs/app.log",
    openSearchConfig: openSearchConfig,
    environment: "Production",
    autoExportContextMetric: true
);

Logs.SetLoggingLevel(LogEventLevel.Debug);

Antes de detener la aplicación llama a CloseAndFlush para enviar los datos pendientes

Logs.CloseAndFlush();

Logs básicos y estructurados

Logs.Information("Usuario {UserId} inició sesión", userId);
Logs.Warning("Intentos de acceso fallidos {Count} para {User}", attempts, userEmail);
Logs.Error("Error al procesar pedido {OrderId}: {Message}", orderId, ex.Message);

Métricas

var counter = new Logs.CounterMetric(
    metricName: "pagos_ok",
    unit: "hit",
    initial: 0.0m,
    tags: new Dictionary<string, string> { { "status", "ok" }, { "component", "payments" } }
);

counter.Increment();       // +1
counter.Increment(5.0m);   // +5

// Fuerza exportación (y reseteo del contador a 0)
Logs.MetricExporter.Flush();

Helpers de ejecución

  • HandleAction y HandleActionAsync envuelven tu código con try/catch, cronómetro y logs coherentes, devolviendo un resultado con:

    • IsOk: indica éxito.

    • MessageException: detalle del error si falló.

var result = Logs.HandleAction(
    component: nameof(PagosService),
    action: nameof(PagosService.Cobrar),
    actionToRun: () =>
    {
        // Tu lógica
        ProcesarCobro(pedidoId);
    },
    details: new { PedidoId = pedidoId }
);

if (!result.IsOk)
{
    // Manejo de error
    Logs.Error("No se pudo cobrar pedido {PedidoId}: {Error}", pedidoId, result.MessageException);
}

Middleware de correlación (idea):

app.Use(async (context, next) =>
{
    var componentName = "HttpRequest";
    var actionName    = context.Request.Path.Value ?? "/";
    var correlationId = context.Request.Headers["X-Correlation-Id"].FirstOrDefault()
                        ?? $"corr-{Guid.NewGuid():N}";

    using (Logs.BeginCorrelationContext(componentName, actionName, correlationId))
    {
        await next();
    }
});

Última actualización