Serilog: Loguear el nombre de la clase
Serilog es una de las librerias para manejar el loggeo en .NET mas conocida: aparte de ser muy flexible, siempre esta actualizada, hay muchos pluggins y soporta practicamente todas las versiones de .NET (tanto viejas como nuevas).
Yo la tengo en la API del blog, pero nunca la habia configurado, siempre la habia dejado como venia de fabrica.
Entre las cosas que mejore, es que me agregue desde que clase se esta produciendo el log: eso me viene espectacular para poder filtrar en Grafana lo que quiero ver. Por ejemplo, asi se ve un warning de LaunchDarkly, que uso para los flags:
{"Message":"\"Timed out\" sending \"2 event(s)\"; \"will retry after one second\"","MessageTemplate":"{0} sending {1}; {2}","0":"Timed out","1":"2 event(s)","2":"will retry after one second","SourceContext":"LaunchDarkly.Sdk.Events","Application":"Peorth.Blog.API","level":"warning"}
Como pueden ver, en la propiedad SourceContext se puede ver desde que Libreria viene el warning. Esto me permitio hacer una buena limpieza de un monton de eventos que no me servian para nada, y si veo algun error importante, puedo saber inmediatamente desde que clase viene.
Pero para hacer esto, no solo necesito Serilog, sino que tengo que hacer unas modificaciones en el codigo.
- Primero instalar Serilog en la API
- En el
appSettings.json, debemos configurar el template que queremos usar para nuestros mensajes:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": {
"Default": "Information"
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
}
}
]
}
}
La parte importante es el outputTemplate, y principalmente, el SourceContext, junto con el Sink (donde va a escribir el log basicamente). Para AWS Lambda, cuando la app en .NET escribe a la consola, se manda automaticamente a Cloudwatch (siempre y cuando tengas permisos para escribir ahi, claro esta).
- En nuestro
Program.cs, debemos agregar la llamada para poder registrar Serilog como nuestro logger por default. Esto es importante, porque tambien registra las clasesILogger<T>que vamos a usar al hacer DI
var loggerConfig = new LoggerConfiguration()
.ReadFrom.Configuration(configuration);
Log.Logger = loggerConfig.CreateLogger();
...
serviceCollection.AddLogging(builder => builder.AddSerilog(Log.Logger));
- Ahora en nuestras clases, en vez de inyectar el
Serilog.LogoILogger(solo), debemos cambiarlo para que inyecteILogger<T>donde T es nuestra clase. Por ej, si tenemos un servicio de search, hariamosILogger<SearchService>o algo por el estilo. Al hacer esto, automaticamente Serilog va a imprimir en elSourceContextla palabra "SearchService", haciendo que sea facil desde que clase se escribio el log.
PD: Lean el site de loggingsucks.com, es excelente si quieren mejorar su logs 😊
Comentarios Recientes
No hay comentarios, porque no dejás alguno?

Deja un comentario



