Proste logi z Serilog

Konfigurowanie loggera nigdy nie było prostsze

Piotr Wandycz

Nie wiem jaka biblioteka jest najbardziej powszechna na rynku, bo odkąd zobaczyliśmy Seriloga dwa lata temu, to nie było potrzeby szukać innego rozwiązania. Wcześniej używaliśmy NLog oraz log4net, ale zapamiętałem je raczej kiepsko. Nie chcę ich krytykować – to dobre rozwiązania, ale dla zupełnego laika Serilog będzie najprostszym wyborem. Możliwe, że znalezienie przez nas Seriloga zbiegło się w czasie z przechodzeniem na .NET Core i wspomniane narzędzia byłyby teraz prostsze w ustawieniu.

Konfiguracja jest banalna i szybka, dlatego Serilog ląduje u mnie w każdym projekcie. Przedstawię tutaj jedynie jak zrobić zapis do pliku i konsoli, ale zachęcam Cię do zapoznania się z dobrze napisaną dokumentacją, aby poznać pełne możliwości. Dodatkowo każdy NuGet rozszerzający możliwości biblioteki ma własną, obficie opisaną stronę na GitHubie.

Aby rozpocząć korzystanie z biblioteki, doinstalujemy dwa NuGety – Serlilog i Serilog.AspNetCore. Pokazuję setup na przykładzie projektu AspNetCore, gdyż jest to większość rynku. Nie ma znaczenia czy korzystamy w WebApi, MVC czy Razor Pages. Jednym poleceniem rozszerzamy framework o używanie loggera, a w środku wskazujemy mu jak dostać się do appsettings.json. E voilà!

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace SerilogSetup
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseSerilog((context, config) =>
                    {
                        config.ReadFrom.Configuration(context.Configuration);
                    });
                });
    }
}

Teraz przyszła pora na decyzję, w jakich miejscach będą składowane logi (lub dosłownie mówiąc – zlewane). Do dyspozycji mamy kilkadziesiąt opcji. W tym przypadku jest to konsola i plik, więc instaluję dwa NuGety: Serilog.Sinks.Console i Serilog.Sinks.File. Korzystałem w pracy także z zapisu do bazy MsSqlServer i nie napotkałem problemów. Jego konfiguracja zajmuje dużo więcej tekstu w configu, ale wystarczy skopiować ją ze strony GitHuba i dostosować nazwę connection stringa. Aplikacja sama utworzy odpowiednią tabelkę w bazie, jeśli ta nie istnieje.

W appsettings.json można pozbyć się domyślnej konfiguracji loggera dostarczonej przez Microsoft i zastąpić ją poniższą. Znajduje się w niej parę sekcji, na które warto zwrócić uwagę.

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "Logs/log.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

Bardzo ważne jest, żeby wskazać nazwy doinstalowanych przez nas paczek NuGetowych. Następnie domyślny poziom logowania. Serilog stopniuje je jako: Verbose < Debug < Information < Warning < Error < Fatal. Sekcja Override jest opcjonalna, ale polecam zostawić ją i zapiąć się na wyłapywanie zdarzeń od Microsoftu. Ostatnia część to personalizacja każdego Sinka. W konsoli nic nie zmieniam, chociaż tu można np. sformatować sposób wypisywania komunikatu. W pliku podaję ścieżkę, gdzie zapisywane będą logi (wychodząc od appsettings.json) oraz jak często będzie ten plik tworzony – w tym przypadku codziennie nowy. Tak jest chyba najwygodniej wyszukiwać błędy, oczywiście jeśli wiemy, w jaki dzień coś się zepsuło.

Gotowe. Możemy już używać loggera. Teraz w miejscu, gdzie chcemy coś zalogować, wystarczy dodać using Serilog. Logger jest statyczny, więc możemy odwołać się do niego bezpośrednio – podając poziom, na jakim chcemy coś zapisać:

using Microsoft.AspNetCore.Mvc.RazorPages;
using Serilog;

namespace SerilogSetup.Pages
{
    public class IndexModel : PageModel
    { 
        public void OnGet()
        {
            Log.Information("Navigated to Pages/Index");
        }
    }
}

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *