Belldandy
Un blog? Que es esto, 2004? Mi nombre es Andrea, y hace muchos años que trabajo en sistemas.
AWS Certified: Solution Architect - Associate
AWS Certified: Developer - Associate
Archivo
Logo

Serilog: Loguear el nombre de la clase

Publicado el 11 ene 2026, 15:17:00 —  Categorias: .NET

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.

  1. Primero instalar Serilog en la API
  2. 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).

  1. En nuestro Program.cs, debemos agregar la llamada para poder registrar Serilog como nuestro logger por default. Esto es importante, porque tambien registra las clases ILogger<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));
  1. Ahora en nuestras clases, en vez de inyectar el Serilog.Log o ILogger (solo), debemos cambiarlo para que inyecte ILogger<T> donde T es nuestra clase. Por ej, si tenemos un servicio de search, hariamos ILogger<SearchService> o algo por el estilo. Al hacer esto, automaticamente Serilog va a imprimir en el SourceContext la 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 😊

Volver

Comentarios Recientes

No hay comentarios, porque no dejás alguno?

¡Comentario agregado con éxito!
Angel

Deja un comentario

(no se publica)