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.
Open Search
OpenSearch gestionado (recomendado): OVHcloud Para centralizar y consultar tus logs y métricas, recomendamos contratar OpenSearch gestionado de OVHcloud.
Servicio administrado, con TLS y autenticación integrados.
Escalado sencillo y precio competitivo para dev y producción.
Centros de datos en Europa (cumplimiento y residencia de datos).
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