Poziomy rejestrowania - Logback - praktyczna reguła do przypisywania poziomów rejestrowania


258

Używam logback w moim bieżącym projekcie.

Oferuje sześć poziomów logowania: TRACE DEBUG INFO WARN ERROR OFF

Szukam ogólnej zasady określania poziomu dziennika dla typowych działań. Na przykład, jeśli wątek jest zablokowany, komunikat dziennika powinien być ustawiony na poziom debugowania lub poziom informacji. Lub jeśli używane jest gniazdo, czy jego konkretny identyfikator powinien być rejestrowany na poziomie debugowania lub na poziomie śledzenia.

Będę wdzięczny za odpowiedzi z większą liczbą przykładów dla każdego poziomu logowania.


3
W rzeczywistości poziomy te są zdefiniowane przez Simple Logging Facade for Java (SLF4J) , zestaw interfejsów, które mają być fasadą przed implementacją rejestrowania. Logback jest taką implementacją.
Basil Bourque,

Odpowiedzi:


467

Buduję głównie systemy na dużą skalę, o wysokiej dostępności, więc moja odpowiedź jest tendencyjna do spojrzenia na to z punktu widzenia wsparcia produkcji; powiedziawszy, przypisujemy z grubsza w następujący sposób:

  • błąd : system jest w niebezpieczeństwie, prawdopodobnie dotyczy to klientów (lub wkrótce nastąpi), a poprawka prawdopodobnie wymaga interwencji człowieka. Obowiązuje tutaj „reguła 2AM” - jeśli dyżurujesz, czy chcesz obudzić się o 2 rano, jeśli ten stan się zdarzy? Jeśli tak, zaloguj się jako „błąd”.

  • ostrzeżenie : miało miejsce nieoczekiwane wydarzenie techniczne lub biznesowe, może to dotyczyć klientów, ale prawdopodobnie nie jest wymagana natychmiastowa interwencja człowieka. Na wezwanie ludzie nie zostaną natychmiast wezwani, ale personel pomocniczy będzie chciał jak najszybciej przeanalizować te problemy, aby zrozumieć wpływ. Zasadniczo każdy problem, który należy śledzić, ale może nie wymagać natychmiastowej interwencji.

  • informacje : rzeczy, które chcemy zobaczyć na wysokim poziomie, na wypadek, gdybyśmy musieli przeanalizować problemowo w ramach analizy sądowej. Zdarzenia cyklu życia systemu (uruchomienie systemu, zatrzymanie) przejdź tutaj. Wydarzenia cyklu życia „Sesja” (logowanie, wylogowanie itp.) Znajdują się tutaj. Należy również wziąć pod uwagę znaczące zdarzenia graniczne (np. Wywołania bazy danych, zdalne wywołania API). Można tu znaleźć typowe wyjątki biznesowe (np. Logowanie nie powiodło się z powodu złych danych uwierzytelniających). Każde inne wydarzenie, które uważasz, że musisz zobaczyć w produkcji na dużą skalę, znajduje się tutaj.

  • debugowanie : prawie wszystko, co nie powoduje cięcia „informacji” ... każdy komunikat, który jest pomocny w śledzeniu przepływu przez system i izolowaniu problemów, szczególnie na etapie programowania i kontroli jakości. Używamy dzienników poziomu „debugowania” do wchodzenia / wychodzenia z większości nietrywialnych metod oraz oznaczania interesujących zdarzeń i punktów decyzyjnych wewnątrz metod.

  • trace : nie używamy tego często, ale byłoby to w przypadku bardzo szczegółowych i potencjalnie dużych dzienników, których zwykle nie chcesz włączać nawet podczas normalnego programowania. Przykłady obejmują zrzucanie pełnej hierarchii obiektów, rejestrowanie pewnego stanu podczas każdej iteracji dużej pętli itp.

Ważnym lub ważniejszym niż wybranie właściwych poziomów dziennika jest upewnienie się, że dzienniki są znaczące i mają potrzebny kontekst. Na przykład prawie zawsze będziesz chciał dołączyć identyfikator wątku do dzienników, aby w razie potrzeby móc śledzić pojedynczy wątek. Możesz także zastosować mechanizm kojarzenia informacji biznesowych (np. ID użytkownika) z wątkiem, aby również został zalogowany. W wiadomości dziennika należy podać wystarczającą ilość informacji, aby zapewnić, że wiadomość może zostać wykonana. Dziennik typu „Złapany wyjątek FileNotFound” nie jest zbyt pomocny. Lepszym komunikatem jest „Złapano wyjątek FileNotFound podczas próby otwarcia pliku konfiguracyjnego: /usr/local/app/somefile.txt. UserId = 12344.”

Istnieje również wiele dobrych przewodników po logowaniu ... na przykład oto edytowany fragment kodu JCL (Jakarta Commons Logging) :

  • error - Inne błędy w czasie wykonywania lub nieoczekiwane warunki. Spodziewaj się, że będą natychmiast widoczne w konsoli stanu.
  • warn - użycie przestarzałych interfejsów API, złe użycie interfejsu API, „prawie” błędy, inne sytuacje uruchomieniowe, które są niepożądane lub nieoczekiwane, ale niekoniecznie „nieprawidłowe”. Spodziewaj się, że będą natychmiast widoczne w konsoli stanu.
  • info - Ciekawe zdarzenia uruchomieniowe (uruchomienie / zamknięcie). Spodziewaj się, że będą natychmiast widoczne na konsoli, więc zachowaj ostrożność i ograniczaj się do minimum.
  • debugowanie - szczegółowe informacje o przepływie przez system. Spodziewaj się, że zostaną zapisane tylko w dziennikach.
  • ślad - bardziej szczegółowe informacje. Spodziewaj się, że zostaną zapisane tylko w dziennikach.

1
Interesujące, więc zakładam, że jeśli logujesz żądania API, a użytkownik popełni błąd w formacie parametru (IllegalArgumentException), to jest poziom INFO, prawda?
Emilio,

51

Moje podejście, jak sądzę, pochodzi bardziej z rozwoju niż z operacyjnego punktu widzenia, jest następujące:

  • Błąd oznacza, że ​​wykonanie niektórych zadań nie mogło zostać zakończone; nie można wysłać wiadomości e-mail, strony nie można renderować, niektórych danych nie można zapisać w bazie danych, coś w tym rodzaju. Coś zdecydowanie poszło nie tak.
  • Ostrzeżenie oznacza, że ​​stało się coś nieoczekiwanego, ale wykonanie może być kontynuowane, być może w trybie awaryjnym; brak pliku konfiguracyjnego, ale użyto ustawień domyślnych, cena została obliczona jako ujemna, więc została ustalona na zero itp. Coś jest nie tak, ale jeszcze nie poszło źle - ostrzeżenia są często znakiem, że będzie błąd już wkrótce.
  • Informacje oznaczają, że wydarzyło się coś normalnego, ale znaczącego; system się uruchomił, system zatrzymał, uruchomiono codzienną aktualizację zapasów itp. Nie powinno być ich ciągłego potoku, w przeciwnym razie jest po prostu zbyt wiele do przeczytania.
  • Debugowanie oznacza, że ​​stało się coś normalnego i nieistotnego; na stronie pojawił się nowy użytkownik, strona została zrenderowana, zamówienie zostało przyjęte, cena została zaktualizowana. Są to rzeczy wykluczone z informacji, ponieważ byłoby ich zbyt wiele.
  • Śledzenie jest czymś, czego nigdy tak naprawdę nie użyłem.

18

Może to również stycznie pomóc zrozumieć, czy żądanie rejestrowania (z kodu) na pewnym poziomie spowoduje jego faktyczne zalogowanie, biorąc pod uwagę efektywny poziom rejestrowania, z którym skonfigurowano wdrożenie. Zdecyduj, na jakim efektywnym poziomie chcesz skonfigurować wdrożenie z innych Odpowiedzi tutaj, a następnie zapoznaj się z tym, aby sprawdzić, czy konkretne żądanie logowania z Twojego kodu zostanie faktycznie zarejestrowane, a następnie ...

Na przykład :

  • „Czy wiersz kodu rejestrujący logujący się w WARN rzeczywiście zostanie zalogowany w moim wdrożeniu skonfigurowanym z ERROR?” Tabela mówi: NIE.
  • „Czy wiersz kodu rejestrujący logujący się w WARN rzeczywiście zostanie zalogowany w moim wdrożeniu skonfigurowanym z DEBUG?” Tabela mówi: TAK.

z dokumentacji logowania :

Bardziej graficznie, oto jak działa reguła wyboru. W poniższej tabeli nagłówek pionowy pokazuje poziom żądania rejestrowania, oznaczony literą p, natomiast nagłówek poziomy pokazuje efektywny poziom rejestratora, oznaczony literą q. Przecięcie wierszy (żądanie poziomu) i kolumn (poziom efektywny) to wartość logiczna wynikająca z podstawowej reguły wyboru. wprowadź opis zdjęcia tutaj

Zatem wiersz kodu, który żąda rejestrowania, zostanie faktycznie zarejestrowany tylko wtedy, gdy efektywny poziom rejestrowania jego wdrożenia jest mniejszy lub równy żądanemu poziomowi ważności tego wiersza kodu .


8

Odpowiadam na to z architektury opartej na komponentach, w której organizacja może uruchamiać wiele komponentów, które mogą na sobie polegać. Podczas niepowodzenia propagacji poziomy rejestrowania powinny pomóc zidentyfikować, których komponentów dotyczy i które są główną przyczyną.

  • BŁĄD - w tym komponencie wystąpiła awaria i uważa się, że przyczyną jest przyczyna wewnętrzna (jakikolwiek wewnętrzny, nieobsługiwany wyjątek, awaria enkapsulowanej zależności ... np. Baza danych, na przykład REST otrzymaliby błąd 4xx z zależności). Zabierz mnie (opiekuna tego komponentu) z łóżka.

  • OSTRZEŻENIE - w tym komponencie wystąpiła awaria, która prawdopodobnie jest spowodowana przez komponent zależny (przykład REST to stan 5xx z zależności). Wyciągnij opiekunów tego elementu z łóżka.

  • INFORMACJE - Wszystko inne, co chcemy dostać się do operatora. Jeśli zdecydujesz się zarejestrować szczęśliwe ścieżki, zalecam ograniczenie do 1 wiadomości dziennika na ważną operację (np. Na przychodzące żądanie HTTP).

W przypadku wszystkich komunikatów dziennika pamiętaj o rejestrowaniu przydatnego kontekstu (i priorytetem jest uczynienie wiadomości czytelnymi / użytecznymi zamiast ryzyk „kodów błędów”)

  • DEBUG (i poniżej) - nie powinien być w ogóle używany (a na pewno nie w produkcji). Podczas projektowania radziłbym używać kombinacji TDD i Debugowania (w razie potrzeby), zamiast zanieczyszczania kodu za pomocą instrukcji dziennika. W produkcji powyższe rejestrowanie INFO w połączeniu z innymi miernikami powinno wystarczyć.

Dobrym sposobem na wizualizację powyższych poziomów rejestrowania jest wyobrażenie sobie zestawu ekranów monitorowania dla każdego komponentu. Gdy wszystkie działają poprawnie, są zielone, jeśli komponent rejestruje OSTRZEŻENIE, wówczas zmieni kolor na pomarańczowy (bursztynowy), jeśli cokolwiek rejestruje BŁĄD, wówczas zmieni kolor na czerwony.

W przypadku incydentu powinieneś mieć jeden (główny powód) składnik na czerwono, a wszystkie dotknięte komponenty powinny mieć kolor pomarańczowy / bursztynowy.


2
+1 za analogię monitora - naprawdę pomaga zobrazować, dlaczego masz ustawione poziomy w ten sposób
emragins

3

Podobnie jak w przypadku innych odpowiedzi, mój framework ma prawie takie same poziomy:

  1. Błąd: krytyczne błędy logiczne w aplikacji, takie jak przekroczenie limitu czasu połączenia z bazą danych. Rzeczy, które wymagają naprawy błędów w najbliższej przyszłości
  2. Ostrzeżenie: nierozwiązane problemy, ale na które należy zwrócić uwagę. Nie znaleziono żądanej strony
  3. Informacje: używane w pierwszym wierszu funkcji / metod, aby pokazać procedurę, która została wywołana lub krok poszedł dobrze, na przykład wykonane zapytanie wstawiania
  4. log: informacje logiczne, takie jak wynik instrukcji if
  5. debugowanie: zmienne treści istotne do stałego oglądania
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.