Logování pomocí Serilogu a Seq

24.02.2021

Logování je nedílnou součástí každé aplikace nebo systému a v dnešním článku si nakonfigurujeme Seq server, který bude agregovat veškeré aplikační logy, které mu pošleme a díky tomu je budeme moci snadno procházet a rychle identifikovat případné příležitosti ke zlepšení, například chyby nebo pomalé requesty :-)

Slovníček

ASP.NET Core Open-source webový framework od Microsoftu (první release 2016).
Serilog Populární knihovna pro logování v .NET aplikacích, podporující strukturované logy.
Seq Komerční profesionální nástroj pro monitorování logů od společnosti Datalust.

Obsah

Úvod

Nejdříve si nainstalujeme Seq server, který bude naslouchat na localhostu. Poté vygenerujeme aplikační klíč, který bude sloužit k autorizaci a nakonec si vytvoříme jednoduchou ASP.NET Core aplikaci, ve které nakonfigurujeme Serilog a nastavíme, aby logy byly posílány na Seq server. Konfiguraci Serilogu budeme načítat z appsettings.json souboru, abychom mohli za běhu měnit log level a zároveň si autorizační klíč načteme z environment proměnných, v mém případě IIS serveru, aby se nám nedostal do verzovacího systému.

Nastavení Seq

Instalace není nijak složitá, pouze stáhneme instalační balíček, spustíme instalaci a vybereme jestli konfiguraci služby chceme provést pomocí wizardu (pokud ne, tak můžeme později konfigurovat pomocí příkazu seq, kterým můžeme službu kdykoliv upravit nebo přeinstalovat). Nastavit lze URL adresu, na které služba bude naslouchat, cestu k úložišti logů, SSL thumbprint a administrátorské jméno s heslem. Ve výchozí instalaci je konfigurační soubor Seq.json uložený ve složce C:\ProgramData\Seq, kam se ukládají i data.

Vygenerování aplikačního klíče

Otevřeme Seq ve webovém prohlížeči a přejdeme do záložky settings > API KEYS na adresehttp://localhost:5341/#/settings/api-keys kde zaškrtneme, že chceme vyžadovat autorizaci, před tím než server přijme nějaké logy.

V opačném případě také můžeme nastavit výchozí Unauthenticated API key v záložce Data > Ingestion, kterému můžeme přidat Applied properties například na hodnotu Application:Unauthenticated (proměnná má přednost před tím co posílá serilog a můžeme podle ní filtrovat logy), abychom pak byli schopní jednoduše aplikace mezi sebou rozeznat (autorizované od ostatních).
Vygenerujeme klíč pomocí ADD API KEY tlačítka/formuláře, kde si zvolíme název naší aplikace (WebApp) a přidáme si Application:WebApp proměnnou do všech logů. Klíč se nám pak objeví v modálním okně.

Nastavení IIS

Aby si aplikace mohla načíst autorizační klíč z environment proměnných, můžeme klíč nastavit přímo v IIS. Jak nastavit proměnnou popisuji v předchozím článku, nicméně naše proměnná musí být v souladu se serilog nastavením, které budeme mít v appsettings.json configu. Info jak nastavit proměnnou, aby se načetla v rámci správné sekce appsettings souboru, najdeme v dokumentaci. V mém případě je to Serilog__WriteTo__0__Args_apiKey.

Nastavení Serilogu

V asp.net core aplikaci pomocí balíčkovacího nástroje Nuget nainstalujeme Serilog knihovnu s podporou Seq.

Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.Seq -DependencyVersion Highest
V souboru Program.cs upravíme metodu IHostBuilder, ve které nastavíme Serilog jako poskytovatele logů.
public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog(
                    (context, services, configuration) =>
                    {
                        configuration
                        // Load serilog section from appsettings.json
                        // https://github.com/serilog/serilog-settings-configuration
                        .ReadFrom.Configuration(context.Configuration)
                        // Enable pushing properties
                        // https://github.com/serilog/serilog-aspnetcore#pushing-properties-to-the-iloggert
                        .Enrich.FromLogContext();
                    })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Hlavní nastavení pak máme v již zmiňovaném appsettings.json konfiguračním souboru, kde sekci Logging nahradíme sekcí Serilog. Na první WriteTo pozici musí být Seq konfigurace, protože jsme nastavili environment proměnnou jako Serilog__WriteTo__0__Args_apiKey

"Serilog": {
  "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Seq" ],
  "MinimumLevel": "Information",
  "WriteTo": [
    {
      "Name": "Seq",
      "Args": {
        "serverUrl": "http://localhost:5341",
        // We can change log level in runtime when needed.
        "restrictedToMinimumLevel": "Information",
        // Api key is loaded from IIS environment variables storage.
        // For local development, key should be in secrets.json.
        // https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows
        // "apiKey": "iBR56916yONxYlN4dAIr"
      }
    },
    {
      "Name": "Console",
      "args": {
        "restrictedToMinimumLevel": "Error"
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
  // We set application name property already in Seq API key settings.
  //"Properties": {
  //  "Application": "WebApp"
  //}
}

V souboru Starup.cs v metodě Configure si můžeme donastavit Serilog konfiguraci a můžeme si například do všech logů přidat proměnné Environment a User.

// Customizing what to log
// https://github.com/serilog/serilog-aspnetcore#request-logging
app.UseSerilogRequestLogging(options =>
{
    // Attach additional properties to the request completion event
    options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
    {
        diagnosticContext.Set("Environment", Environment.EnvironmentName);
        diagnosticContext.Set("User", httpContext.User.Identity.Name);
    };
});

Závěr

Nyní máme již vše připravené a pokud aplikaci vypublikujeme na IIS server, tak můžeme vidět, že nám přibývají logy v Seq serveru, které si můžeme jednoduše libovolně filtrovat. Případný alerting si pak můžeme donastavit podle dokumentace.

Odkazy