Saltar al contenido

BeginScope con Serilog

Hola usuario de nuestra página, encontramos la solución a tu pregunta, continúa leyendo y la obtendrás aquí.

Solución:

Sí, Serilog tiene un equivalente nativo de esta característica, llamado usando LogContext.PushProperty().

Para habilitar esto, primero debe agregar Enrich.FromLogContext() a su Serilog LoggerConfiguration, por ejemplo:

Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext() // <- this line
    .WriteTo.Console(outputTemplate: "[Timestamp:HH:mm:ss Level:u3] Message:lj " +
                                     "Properties:jNewLineException"))
    .CreateLogger();

Luego, para insertar propiedades en el contexto (equivalente a ILogger.BeginScope()), usar:

using (LogContext.PushProperty("OrderId", 1234))

    Log.Information("Processing a new order");
    // ...etc

La configuración anterior incluye Properties:j para asegurarse de que todas las propiedades del evento, como las del contexto del registro, se incluyan en la salida. La forma en que verá las propiedades adicionales dependerá del sumidero que esté utilizando.

La respuesta de @Nicholas es correcta. Solo quería dejar un pequeño ejemplo práctico para cualquier otra persona que venga a este hilo para señalar algo que no es tan obvio;

Aquí hay un código de ejemplo que muestra cómo usar el contexto de Serilog;

void Main()

    var log = Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .MinimumLevel.Information()
    .WriteTo.Console()
    
    .CreateLogger();
    Log.Logger = log;
    log.Information("Starting app");
    
    Task.WaitAll(
        Task.Run (() => GetNums(10,15, 2, "evens")),
        Task.Run (() => GetNums(11, 15, 2, "odds"))
    );
    
    log.Information("Finished.");

    Console.ReadLine();
    


static Random R = new Random();

static void GetNums(int start, int cnt, int inc, string name)

    using(var log = LogContext.PushProperty("name", name))
    
        for (int i = start; i < start + cnt; i+=inc)
        
            Log.Information("number,name", i);
            Thread.Sleep(R.Next(500));
        
    

produce esta salida

[17:11:31 INF] Starting app
[17:11:31 INF] 10,evens
[17:11:31 INF] 11,odds
[17:11:31 INF] 12,evens
[17:11:31 INF] 14,evens
[17:11:32 INF] 13,odds
[17:11:32 INF] 16,evens
[17:11:32 INF] 15,odds
[17:11:32 INF] 18,evens
[17:11:32 INF] 20,evens
[17:11:32 INF] 17,odds
[17:11:32 INF] 22,evens
[17:11:33 INF] 24,evens
[17:11:33 INF] 19,odds
[17:11:33 INF] 21,odds
[17:11:34 INF] 23,odds
[17:11:34 INF] 25,odds
[17:11:34 INF] Finished.

Lo que quería señalar es que los elementos registrados en el contexto no aparecerán en los registros (es decir, no se registrarán) si el valor nombrado no aparece en su plantilla.

Por ejemplo, en el código anterior, si cambiamos Log.Information("number,name",i); a Log.Information("number",i); entonces esto es lo que obtendría, y esto es similar a lo que podría obtener si no configura el enriquecimiento Enrich.FromLogContext(). Es sutil y fácil olvidarse de actualizar la plantilla y perseguir su cola tratando de encontrar el error.

sin plantilla string incluyendo las propiedades nombradas incluidas en el contexto

[17:22:11 INF] Starting app
[17:22:11 INF] 10
[17:22:11 INF] 11
[17:22:11 INF] 12
[17:22:11 INF] 13
[17:22:11 INF] 15
[17:22:11 INF] 17
[17:22:12 INF] 14
[17:22:12 INF] 16
[17:22:12 INF] 19
[17:22:12 INF] 18
[17:22:12 INF] 20
[17:22:12 INF] 21
[17:22:12 INF] 23
[17:22:12 INF] 22
[17:22:12 INF] 24
[17:22:13 INF] 25
[17:22:13 INF] Finished.

además, las propiedades enriquecidas son appended hasta el final de la string, entonces
Log.Information("name,number", i); produciría

[17:35:11 INF] Starting app
[17:35:11 INF] 11,number
[17:35:11 INF] 10,number

¡Feliz registro! Espero que esto haya ayudado.

Valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *