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.
Odpowiedzi:
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) :
źródło
Moje podejście, jak sądzę, pochodzi bardziej z rozwoju niż z operacyjnego punktu widzenia, jest następujące:
źródło
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 :
z dokumentacji logowania :
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 .
źródło
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”)
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.
źródło
Podobnie jak w przypadku innych odpowiedzi, mój framework ma prawie takie same poziomy:
źródło