w , ,

FajneFajne Dobre!Dobre! ŚwietnieŚwietnie

Logowanie zdarzeń – SLF4J [Spring Boot #27]

logowanie zdarzeń spring boot

SLF4J to jedna z najpopularniejszych bibliotek do Java, która umożliwia logowanie zdarzeń występujących w trakcie działania aplikacji, dlatego Spring Boot zaadoptował to rozwiązanie jako domyślne narzędzie do sporządzania logów aplikacji.

Wykorzystanie SLF4J w Spring Boot

W celu powołania instancji loggera wystarczy w ramach wybranej klasy skorzystać z metody wytwórczej: pochodzącej z LoggerFactory:

@Service
public class UserService {
    private Logger logger = LoggerFactory.getLogger(UserDetails.class);
}

Dobrą praktyką jest przekazanie do metody parametru reprezentującego klasę z której chcemy, aby logi pochodziły. Podczas, gdy złą praktyką będzie stworzenie jednego loggera na całą aplikacje, co czasami przychodzi do głowy młodym programistom mającą nadmierne tendencje do skracania kodu 🙂

Logowanie zdarzeń w SLF4J

Aby odnotować zdarzenie wystarczy odwołać się do instancji loggera i z pomocą jednej z metod reprezentujących poziom logowania wypisać zdarzenie, np:

@Service
public class UserService {
    private Logger logger = LoggerFactory.getLogger(UserDetails.class);
}

W rezultacie otrzymujemy log w konsoli, który zawiera dane, poziom, klasę z której pochodzi log, oraz jego tresć.

slf4j. logowanie info

Klasa z której pochodzi log jest rezultatem odpowiedniego sparametryzowania metody wytwórczej, dlatego wspomniałem, że nie warto tworzyć jednej instancji logera na całą aplikacje. Oczywiście zbiór informacji wyświetlanych można swobodnie skonfigurować.

Poziomy logowania zdarzeń w SLF4J

Oprócz poziomu logowania INFO wykorzystanego w powyższym przykładzie mamy też dostępne inne, wszystkie one są zdefiniowane w ramach enum.

public enum LogLevel {
    TRACE,
    DEBUG,
    INFO,
    WARN,
    ERROR,
    FATAL,
    OFF;

    private LogLevel() {
    }
}

A zatem – teraz w kolejności od najmniej istotnego, do najwyższego:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR

Z tego powodu należy dobierać poziom logowania od intencji przekazywanego komunikatu.

Poniżej przykład wywołania wszystkich poziomów logowania:

public UserService() {
    logger.trace("Hello bycza zagroda!");
    logger.info("Hello bycza zagroda!");
    logger.debug("Hello bycza zagroda!");
    logger.warn("Hello bycza zagroda!");
    logger.error("Hello bycza zagroda!");
}
slf4j. logowanie info, warn, error

A zatem można się zastanowić – czemu 5-krotne wyświetlenie komunikatu dało rezultat w postaci tylko 3 wypisanych logów?
Dzieje się tak dlatego, ponieważ w Spring Boot domyślnym poziomem logowania jest INFO.

Zmiana poziomu logowania w Spring Boot

W application.properties można ustalić poziom logowania zdarzeń w konsoli. Domyślną wartością jest INFO, dlatego logi o poziomie mniej istotnym zostają pominięte.
Aby zmienić ustawienia domyślne wystarczy przypisać dla klucza logging.level.root poziom logowania, który chcemy mieć w aplikacji np.:

logging.level.root=debug

Podsumowanie

Z pewnością logowanie pozwala na gromadzenie uporządkowanych informacji zdobytych w trakcie działania aplikacji. SLF4J to tylko przykładowe narzędzie, istnieją również inne tego samego przeznaczenia np. Log4J. W rezultacie w aplikacji powinniśmy zapomnieć o wszystkich operacjach wyjścia typu System.out i zamienić je na profesjonale loggery 🙂

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Zajęcia w trakcie pandemii

Jak prowadzę zajęcia ze studentami w trakcie pandemii?

wzorce projektowe java

Wzorce projektowe – praktyczny przewodnik