Logowanie w C# – Serilog

Chyba każdy z nas używa logowania w swojej aplikacji. Jeśli jednak ktoś tego nie robi, to zachęcam zacząć. W innym przypadku może być mu trudno zareagować, kiedy coś się wysypie.

Postaram się w kilku prostych krokach pokazać, jak dodać logowanie do naszej aplikacji z wykorzystaniem Serilog.

Wymagane zależności

Główną zależnością, którą będziemy musieli dołączyć do naszego projektu jest:

Serilog.AspNetCore

Dodanie loggera

Najpierw musimy utworzyć obiekt klasy Logger. Wykorzystamy do tego klasę LoggerConfiguration. Najprościej można to zrobić w następujący sposób:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.File("logs.log")
    .CreateLogger();

Utworzyliśmy loggera, który będzie logował do pliku „logs.log” wszystko o poziomie „Information” lub większym.

Użycie loggera

Z wcześniej utworzonego loggera możemy korzystać już w całej naszej aplikacji wykorzystując statyczny obiekt, np.:

public class ItemsService
{
    // ...

    public async Task SomeMethod()
    {
        Log.Logger.Information("Logging test");
        // ...
    }
}

Jednakże dużo lepszym sposobem jest wstrzyknięcie loggera jako zależność przez konstruktor do naszej klasy:

public class ItemsService
{
    private readonly ILogger<ItemsService> _logger;

    public ItemsService(ILogger<ItemsService> logger)
    {
        _logger = logger;
    }

    // ...

    public async Task SomeMethod()
    {
        _logger.LogInformation("Test logging");
        // ...
    }
}

Dzięki temu będzie nam łatwiej napisać testy (zamiast interfejsu do logowania będziemy mogli przekazać jego mock), a dodatkowo nasza klasa nie będzie zależeć od implementacji, tylko od abstrakcji.

Rejestracja loggera

Aby móc wstrzykiwać loggera jako zależność, musimy go zarejestrować w naszej aplikacji. Można to zrobić na dwa sposoby.

Pierwszy, to rejestracja w klasie Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(a => a.AddSerilog());
    // ...
}

Drugi, to rejestracja w klasie Program:

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    return WebHost
        .CreateDefaultBuilder(args)
        .UseSerilog()
        .UseStartup<Startup>();
}

Polecam ten drugi sposób, ponieważ moim zdaniem jest on dużo bardziej przejrzysty. Dodatkowo dodając logger w klasie Program, łatwiej jest go potem wymienić na potrzeby testów (np. w testach zamiast logowania przy użyciu biblioteki Serilog możemy użyć czegoś innego).

Serilog.ILogger

W projektach zawsze staram się używać do logowania interfejsu ILogger<T> z Microsoft.Extensions.Logging, aby nie dodawać kolejnej zależności. Dodatkowo używając ogólnego interfejsu od Microsoft możemy (gdy zajdzie taka potrzeba), wymienić naszą bibliotekę do logowania na inną.

Jednakże jeśli ktoś chce, to może zamiast tego używać interfejsu ILogger z Serilog. Konfiguracja jest dokładnie taka sama, zmianie ulega jedynie rejestracja loggera i jego użycie. Jednakże należy pamiętać, że wtedy każdy projekt używający logowania będzie musiał mieć zależność do biblioteki Serilog.

Rejestracja

Przy pierwszym sposobie rejestracji musimy dodatkowo zarejestrować Log.Logger jako singleton:

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(a => a.AddSerilog());
    services.AddSingleton(Log.Logger);
    // ...
}

Przy drugim sposobie musimy do metody UseSerilog przekazać Log.Logger:

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    return WebHost
        .CreateDefaultBuilder(args)
        .UseSerilog(Log.Logger)
        .UseStartup<Startup>();
}

Używanie

Interfejs ILogger<T> udostępnia metody do logowania z prefiksem „Log”, np.:

logger.LogInformation();
logger.LogDebug();

Interfejs ILogger od Serilog ma metody bez tego prefiksu, czyli:

logger.Information();
logger.Debug();

Jak widzicie różnice są dość kosmetyczne. Sami oceńcie co bardziej Wam odpowiada – czy ogólny interfejs od Microsoft, czy interfejs od danej biblioteki do logowania, np. od Serilog.

Konfiguracja loggera

O tym jak skonfigurować loggera pod nasze potrzeby możecie przeczytać tutaj.

1 myśl na “Logowanie w C# – Serilog”

  1. Pingback: dotnetomaniak.pl

Leave a Reply