# Seq para ASP.NET Logging - Tracing con SerilogTracing

<datetime class="hidden">2024-08-31T11:20</datetime>

<!--category-- ASP.NET, Seq, Serilog -->
# El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En la parte anterior te he mostrado cómo configurar [auto hosting para Seq usando ASP.NET Core ](/blog/selfhostingseq). Ahora que lo hemos instalado's tiempo para usar más de élM SK2s características para permitir un registro más completo & rastreo usando nuestra nueva instancia SeqMSC4

[TOC]

# El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El rastreo es como registrar++ le da una capa adicional de información sobre lo que está ocurriendo en su aplicaciónM SK1 . Es especialmente útil cuando usted tiene un sistema distribuido y necesita rastrear una petición a través de varios servicios.
En este sitio yo'lo uso para recoger problemas rápidamente; tan solo porque es un sitio de aficionado no significa que deje de cumplir mis normas profesionalesM SK3

## Se está configurando Serilog

Establecer un rastreo con Serilog es realmente bastante sencillo usando el [El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.](https://github.com/serilog-tracing/serilog-tracing) package. Primero es necesario instalar los paquetes:

Aquí también se agrega el bañera Console y el Bañera Seq.

```bash
dotnet add package SerilogTracing
dotnet add package SerilogTracing.Expressions
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Seq
```

La consola es siempre útil para la debugging y Seq es lo que nosotros'estamos aquí para.Seq también ofrece una gran cantidad de M SK2enrichers ' que pueden añadir información adicional a sus registrosMSC4

```bash
  "Serilog": {
    "Enrich": ["FromLogContext", "WithThreadId", "WithThreadName", "WithProcessId", "WithProcessName", "FromLogContext"],
    "MinimumLevel": "Warning",
    "WriteTo": [
        {
          "Name": "Seq",
          "Args":
          {
            "serverUrl": "http://seq:5341",
            "apiKey": ""
          }
        },
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/applog-.txt",
          "rollingInterval": "Day"
        }
      }

    ],
    "Properties": {
      "ApplicationName": "mostlylucid"
    }
  }
```

Para usar estos enriquecedores es necesario añadirlos a su `Serilog` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `appsettings.json` file. También es necesario instalar todos los enriqueadores separados usando Nuget.

Es una de las cosas buenas y malas de Serilog.
En el informe del Secretario General sobre la Misión de las Naciones Unidas en Bosnia y Herzegovina (UNMIBH) se señala que, a pesar de los esfuerzos desplegados por la UNMIBH para garantizar la seguridad y la estabilidad en Kosovo y Metohija, la situación sigue siendo frágil.

![El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.](serilogenrichers.png)

Con todos estos bombardeados obtengo una buena salida de registro en Seq.

![El error Serilog Seq](serilogerror.png)

Aquí se ve el mensaje de error, el rastro de la pilaMSC1 el id del hiloM SK2 el ID del proceso y el nombre del proceso. Esta es toda una información útil cuando se trata de rastrear un problema .

Una cosa que hay que señalar es que I'he establecido el `  "MinimumLevel": "Warning",` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `appsettings.json` archivo. Esto significa que sólo los avisos y más arriba serán registrados en SeqM SK1 Esto es útil para mantener el ruido en sus registros.

Sin embargo, en Seq usted también puede especificar esta por Api Key; para que pueda tener `Information` (o si usted 'es realmente entusiasmado `Debug`) establecer el registro aquí y limitar lo que Seq captura realmente por la clave API.

![El Secretario General Adjunto de Operaciones de Mantenimiento de la Paz, Sr.](apikey.png)

Nota: todavía tiene una aplicación superior, también puede hacer esto más dinámico para ajustar el nivel en vueloM SK2 Vea la [El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. ](https://github.com/datalust/serilog-sinks-seq)En el párrafo 2 de su resolución 57/270 B, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción para prevenir, combatir y eliminar el tráfico ilícito de armas pequeñas y ligeras en todos sus aspectos.

```json
{
    "Serilog":
    {
        "LevelSwitches": { "$controlSwitch": "Information" },
        "MinimumLevel": { "ControlledBy": "$controlSwitch" },
        "WriteTo":
        [{
            "Name": "Seq",
            "Args":
            {
                "serverUrl": "http://localhost:5341",
                "apiKey": "yeEZyL3SMcxEKUijBjN",
                "controlLevelSwitch": "$controlSwitch"
            }
        }]
    }
}
```

## El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Ahora añademos Tracing, de nuevo usando SerilogTracing it's pretty simpleM SK2 Tenemos la misma configuración que antes pero añadimos una nueva bañera para el rastreado .

```bash
dotnet add package SerilogTracing
dontet add package SerilogTracing.Expressions
dotnet add SerilogTracing.Instrumentation.AspNetCore
```

También añademos un paquete adicional para registrar información más detallada sobre el núcleo de aspnet.

### El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `Program.cs`

Ahora podemos empezar a usar realmente el rastreo. En primer lugar, necesitamos añadir el rastro a nuestro `Program.cs` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.

```csharp
    using var listener = new ActivityListenerConfiguration()
        .Instrument.HttpClientRequests().Instrument
        .AspNetCoreRequests()
        .TraceToSharedLogger();
```

El rastreo utiliza el concepto de 'ActividadesM SK1 que representan una unidad de trabajo. Puede iniciar una actividad , hacer algún trabajo y luego detenerlaMSC4 Esto es útil para rastrear una petición a través de varios servicios.

En este caso, añademos un rastreo adicional para las solicitudes de HttpClient y las de AspNetCore. También añadimos una `TraceToSharedLogger` que envía la actividad al mismo registrador que el resto de nuestra aplicación.

## El Consejo de Seguridad reanudó el examen del tema sin proceder a votación.

Ahora tenemos un sistema de rastreo que podemos empezar a usar en nuestra aplicación. Aquí'es un ejemplo de servicio que utiliza el rastreoM SK2

```csharp
    public async Task<PostListViewModel> GetPostsByCategory(string category, int page = 1, int pageSize = 10,
        string language = MarkdownBaseService.EnglishLanguage)
    {
        using var activity = Log.Logger.StartActivity("GetPostsByCategory {Category}, {Page}, {PageSize}, {Language}",
            new { category, page, pageSize, language });
        try
        {
            var count = await NoTrackingQuery()
                .Where(x => x.Categories.Any(c => c.Name == category) && x.LanguageEntity.Name == language)
                .CountAsync();
            var posts = await PostsQuery()
                .Where(x => x.Categories.Any(c => c.Name == category) && x.LanguageEntity.Name == language)
                .OrderByDescending(x => x.PublishedDate.DateTime)
                .Skip((page - 1) * pageSize)
                .Take(pageSize)
                .ToListAsync();

            var languages = await GetLanguagesForSlugs(posts.Select(x => x.Slug).ToList());
            var postListViewModel = new PostListViewModel
            {
                Page = page,
                PageSize = pageSize,
                TotalItems = count,
                Posts = posts.Select(x => x.ToListModel(
                    languages.FirstOrDefault(entry => entry.Key == x.Slug).Value.ToArray())).ToList()
            };
            activity.Complete();
            return postListViewModel;
        }
        catch (Exception e)
        {
            activity.Complete(LogEventLevel.Error, e);
        }

        return new PostListViewModel();
    }
```

Las líneas importantes aquí son:

```csharp
  using var activity = Log.Logger.StartActivity("GetPostsByCategory {Category}, {Page}, {PageSize}, {Language}",
            new { category, page, pageSize, language });
```

Esto inicia una nueva 'actividad' que es una unidad de trabajoM SK2 Es útil para seguir una solicitud a través de varios serviciosMSC4
Por lo que se refiere a la cuestión de si el Estado Parte ha cumplido o no las obligaciones contraídas en virtud del párrafo 1 del artículo 5, el Comité observa con preocupación que el Estado parte no ha presentado pruebas suficientes para demostrar la existencia de una violación del Pacto.

```csharp
            activity.Complete();
```

En nuestra gestión de las excepciones también completamos la actividad pero con un nivel de error y la excepción. Esto es útil para detectar problemas en su aplicación.

## El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Ahora tenemos toda esta configuración podemos empezar a usarla. Aquí' es un ejemplo de una traza en mi aplicación .

![El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.](httptrace.png)

Esto le muestra la traducción de un mensaje de marcaje único. Puede ver los pasos múltiples para un mensaje único y todas las peticiones y horarios de HttpClient.

Nota: Utilizo Postgres para mi base de datos, a diferencia del servidor SQL el controlador npgsql tiene soporte nativo para rastrear, por lo que se pueden obtener datos muy útiles de sus consultas de base de données como la SQL ejecutada, horarios etcM SK2 Estos son guardados como MSC3spans ' en Seq y ver liek los siguientesMسک5

```json
  "@t": "2024-08-31T15:23:31.0872838Z",
"@mt": "mostlylucid",
"@m": "mostlylucid",
"@i": "3c386a9a",
"@tr": "8f9be07e41f7121cbf2866c6cd886a90",
"@sp": "8d716c5f01ad07a0",
"@st": "2024-08-31T15:23:31.0706848Z",
"@ps": "622f1c86a8b33304",
"@sk": "Client",
"ActionId": "91f5105d-93fa-4e7f-9708-b1692e046a8a",
"ActionName": "Mostlylucid.Controllers.HomeController.Index (Mostlylucid)",
"ApplicationName": "mostlylucid",
"ConnectionId": "0HN69PVEQ9S7C",
"ProcessId": 30496,
"ProcessName": "Mostlylucid",
"RequestId": "0HN69PVEQ9S7C:00000015",
"RequestPath": "/",
"SourceContext": "Npgsql",
"ThreadId": 47,
"ThreadName": ".NET TP Worker",
"db.connection_id": 1565,
"db.connection_string": "Host=localhost;Database=mostlylucid;Port=5432;Username=postgres;Application Name=mostlylucid",
"db.name": "mostlylucid",
"db.statement": "SELECT t.\"Id\", t.\"ContentHash\", t.\"HtmlContent\", t.\"LanguageId\", t.\"Markdown\", t.\"PlainTextContent\", t.\"PublishedDate\", t.\"SearchVector\", t.\"Slug\", t.\"Title\", t.\"UpdatedDate\", t.\"WordCount\", t.\"Id0\", t0.\"BlogPostId\", t0.\"CategoryId\", t0.\"Id\", t0.\"Name\", t.\"Name\"\r\nFROM (\r\n    SELECT b.\"Id\", b.\"ContentHash\", b.\"HtmlContent\", b.\"LanguageId\", b.\"Markdown\", b.\"PlainTextContent\", b.\"PublishedDate\", b.\"SearchVector\", b.\"Slug\", b.\"Title\", b.\"UpdatedDate\", b.\"WordCount\", l.\"Id\" AS \"Id0\", l.\"Name\", b.\"PublishedDate\" AT TIME ZONE 'UTC' AS c\r\n    FROM mostlylucid.\"BlogPosts\" AS b\r\n    INNER JOIN mostlylucid.\"Languages\" AS l ON b.\"LanguageId\" = l.\"Id\"\r\n    WHERE l.\"Name\" = @__language_0\r\n    ORDER BY b.\"PublishedDate\" AT TIME ZONE 'UTC' DESC\r\n    LIMIT @__p_2 OFFSET @__p_1\r\n) AS t\r\nLEFT JOIN (\r\n    SELECT b0.\"BlogPostId\", b0.\"CategoryId\", c.\"Id\", c.\"Name\"\r\n    FROM mostlylucid.blogpostcategory AS b0\r\n    INNER JOIN mostlylucid.\"Categories\" AS c ON b0.\"CategoryId\" = c.\"Id\"\r\n) AS t0 ON t.\"Id\" = t0.\"BlogPostId\"\r\nORDER BY t.c DESC, t.\"Id\", t.\"Id0\", t0.\"BlogPostId\", t0.\"CategoryId\"",
"db.system": "postgresql",
"db.user": "postgres",
"net.peer.ip": "::1",
"net.peer.name": "localhost",
"net.transport": "ip_tcp",
"otel.status_code": "OK"
```

Podrá ver que esto incluye casi todo lo que necesita saber sobre la consulta, el SQL ejecutado, la cadena de conexión etcM SK2 Esta es toda información útil cuando usted ' está intentando rastrear un problemaMSC4 En una aplicación más pequeña como ésta esto es simplemente interesante

# El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

I'he solo arranqueado la superficie del rastreo aquí , él'es un poco de área con defensores apasionadosM SK3 Espera que I\'\ve demostrado lo sencillo que es empezar con el rastreado simple usando Seq MSC5\ Serilog para ASP\ .\ NET Core applications\ .\ En este modo puedo obtener mucho de los beneficios de herramientas más potentes como Application Insights sin el coste de Azure | (\ estas cosas pueden resultar costosas cuando los registros son grandes |).\