2010-11-12 20 views
106

Korzystamy z kombinacji SLF4J + Logback już od pewnego czasu i jesteśmy z niej zadowoleni, ale nasza strategia logowania jest dość prosta, z wykorzystaniem prostych rejestratorów opartych na klasach i żadnych wymyślnych rzeczy. jak MDC lub Markery.Najlepsze praktyki dotyczące używania znaczników w SLF4J/Logback

Chcę wiedzieć, czy ktokolwiek w społeczności faktycznie korzysta z tych funkcji i w jaki sposób są wykorzystywane do ulepszania rejestrowania/filtrowania.

Jestem szczególnie zainteresowany tym, gdzie, dlaczego i w jaki sposób można użyć [1] znaczników do logowania. Uderzają mnie jako całkiem fajną funkcję dodawania semantycznego kontekstu do rejestrowania - np. podczas gdy klasa może obsługiwać wiele problemów, można użyć specyficznych znaczników zadań/problemów do rozróżnienia instrukcji dziennika.

Jakie mogą być najlepsze praktyki, konwencje lub strategie tworzenia i używania znaczników w rejestrowaniu.

Aktualizacja: Chyba, jaka jestem naprawdę po nie tyle dlaczego używać znaczników, ale raczej jak część — jest tam kilka dobrych praktyk markerów nazewnictwa (np przy użyciu zwykłego tekstu ze spacjami lub nazw stylów kreskowanych/podkreślenia/interpunkcji oddzielonych od słów kluczowych), gdyby istniała jakaś pula "standardowych nazw", nazywanie rzeczy w oparciu o funkcje biznesowe. Pytania mogę prawdopodobnie dowiedzieć się, dla siebie, ale jeśli chcę korzystać z tych funkcji systematycznie i wprowadzić je do zespołu programistów, warto mieć jakąś formalizeable zestaw wytycznych wokół ...


[1] - Pytając jak używać markerów, nie bardzo pytam, jak korzystać z API (jest to naprawdę dość proste) - mam na myśli bardziej ogólny poziom tego, jak można ustawić logowanie przy użyciu znaczników konsekwentnie

Odpowiedz

85

po pierwsze, jak @darioo powiedział:

  • MDC służy do kojarzenia wiele zdarzeń z kilku „entiti es”
  • [Markery] służą do«specjalnych»zdarzeń, które chcesz mieć filtrowane od zwykłych te

Więc twierdzenie, że chcesz używać tego MDC. Markery służą do zaznaczania "specjalnych" wydarzeń - filtrowania, jeśli chcesz - zamiast "krojenia". Na przykład możesz podzielić plasterki na podstawie określonego użytkownika, ale filtrować w oparciu o nieoczekiwane wyjątki. W takim przypadku należy utworzyć wymiar MDC User i znacznik UnexpectedException UnexpectedException.


Ale to najwyraźniej nie rozwiązuje kwestię miał na myśli. Jesteś "raczej odnosząc się do bardziej ogólnego poziomu, w jaki sposób logowałbym się przy użyciu markerów konsekwentnie". Warto więc zająć, że:

MDC jest krojenia i kostki i markery są dla filtrowanie. Czynności te są wykonywane podczas testowania i produkcji. W związku z tym musisz zdecydować, które wymiary mogą być przydatne do wycięcia danych dzienników według i do których przypadków może być użyteczne ich filtrowanie w przypadku pojawienia się testów/produkcji. Każdy wymiar otrzymuje wymiar MDC. Każdy przypadek otrzymuje Marker. To takie proste.

Deweloperzy nie muszą podejmować żadnych decyzji tutaj. Jedna osoba lub zespół powinien zdecydować, w czasie projektowania, jaki rodzaj krojenia, rozłupywania i filtrowania musi być obsługiwany. Należy to wiedzieć, wyobrażając sobie, jakiego rodzaju zadań analitycznych oczekuje się od osób, które mogą zostać poproszone o wykonanie.

Ta sama osoba lub zespół powinien zdecydować o konwencji nazewnictwa. Jest całkowicie arbitralny. Wybierz coś, co jest przyjemne pod względem estetycznym, o charakterze samopisującym, co jest mało prawdopodobne, aby kolidowało z późniejszymi dodatkami. Hyphens vs. Podkreśla, że ​​jest wyjątkowo dziwaczny i niepokojąco, ale zauważmy, że dla pracowników ESL może być mniejszy odczyt podkreśleń (przynajmniej w porównaniu do CamelCase); w tym samym czasie, podobno denerwuje to niektórych programistów z powodu niezręczności dotarcia do wymaganych kluczy.

Jeśli chodzi o podejmowanie decyzji w sprawie polisy, oznacza to tylko, że należy użyć , w którym należy użyć danego wymiaru Markera lub MDC. Trzymaj się tego mocno (scentralizowany, przemyślany), ale pozwól na opinie od programistów, jeśli uważają, że zestaw wymiarów i znaczników jest niewystarczający dla danego zadania. Popraw/dodaj wymiary i/lub atrybuty odpowiednio.

Zrozumieć ta polityka będzie prawie obowiązkowo specyficzna dla projektu. Nie każdy projekt wymaga tego samego rodzaju analizy logowania. Wyobraź sobie kilka koszmarnych scenariuszy. Następnie wyobraź sobie, jak chciałbyś móc analizować dzienniki w tym scenariuszu. Prawdopodobnie nie chcesz pisać skomplikowanego skryptu, aby spróbować wyśledzić, która wiadomość należy do danego kontekstu, i który stan jest, w którym momencie, prawda? Zakoduj wszystkie takie informacje jako wymiary i znaczniki, i oszczędzaj sobie część kłopotów, jeśli coś pójdzie nie tak.

+7

Świetna odpowiedź. Twierdzę, że MDC, który jest strukturą danych opartą na wątku, może być również użyty do filtrowania. – Ceki

+0

Świetna odpowiedź. Ale czym jest _ESL Employee_? – DerMike

+0

Dziękuję. Angielski jako drugi język. – user359996

61

Po pierwsze, MDC.

MDC jest bardzo przydatny w środowisku, w którym występuje jedna "jednostka" powiązana z pewnym zachowaniem. Typowy przykład: interakcja użytkownika z aplikacją internetową. Załóżmy, że masz wielu użytkowników, którzy kręcą się wokół Twojej aplikacji internetowej. Korzystając z MDC, możesz łatwo śledzić je bez zbytniego wysiłku. Uproszczony przykład:

...[Sandy][abcd] clicked on "change profile" 
...[Joe][1234] clicked on "weather reports" 
...[Joe][1234] clicked on "Europe" 
...[Sandy][abcd] clicked on "logout" 
...[Joe][1234] clicked on "logout" 
...[Sandy][efgh] logged in 

Tutaj używasz MDC w dwóch miejscach: dla nazwy użytkownika i dla identyfikatora sesji. W ten sposób możesz łatwo przeglądać sesje jednego użytkownika, aby zobaczyć wszystko, co robią.

Po drugie, markery.

Znaczniki są zwykle używane w "specjalnych" okolicznościach, takich jak wysłanie wiadomości e-mail do administratora w przypadku poważnych błędów krytycznych. Nie wszystkie błędy zawsze należą do tej samej kategorii; niektóre muszą być rozpatrywane w odpowiedni sposób.

Lub, gdy użytkownik opuszcza twoją usługę, zwykle przechodzi do dziennika INFO, ale możesz także użyć znacznika dla takich instancji, jeśli chcesz, aby zdarzenia takie jak ten trafiały w osobnym pliku dziennika, więc można go łatwiej monitorować w celu zbierania danych statystycznych od użytkowników.

Zasada:

  • MDC służy do kojarzenia wiele zdarzeń z kilku „podmioty”
  • znaczniki są wykorzystywane do „specjalnych” zdarzeń, które chcesz mieć filtrowane od zwykłych te
+2

Jest to dobre rozwiązanie, ale obejmuje tylko jeden możliwy przypadek zastosowania i za pomocą markerów. Sposób, w jaki to widzę, polega na rejestrowaniu funkcji ramowych (takich jak MDC i Markery) w celu zapewnienia większej ilości metadanych dla późniejszego krojenia i wycinania dzienników (takich jak e-mail administratora lub osobne przypadki rejestrowania, o których wspomniałeś). Chyba po prostu chciałem stworzyć markery (czy powinno być "standardowe pule" znaczników, czy są jakieś konwencje nazewnictwa, o których należy pamiętać itd.)? –

+2

@Roland: Dodałem kilka przykładów, ale nie mogę dodać wszystkich przykładów, ponieważ są one z definicji nieograniczone. Jeśli rozumiesz motywację i przyczynę znaczników, to używanie ich ogranicza tylko twoja wyobraźnia i zdrowy rozsądek. – darioo

25

Znaczników można używać do koloru kolor lub oznaczyć jeden zestaw pojedynczego. To, co robisz z tymi kolorami, np. Markerami, należy wyłącznie do Ciebie. Jednak wydaje się, że dwa wzorce są powszechne (pierwszy częściej niż drugi) w przypadku użycia znacznika.

  1. Wyzwalanie: Niektóre appender mogłyby zostać poinformowani o konieczności podjęcia działania w obecności określonego markera. Na przykład, można skonfigurować SMTPAppender, aby wysłać wiadomość e-mail, gdy zdarzenie rejestrowania jest oznaczone znacznikiem NOTIFY_ADMIN niezależnie od poziomu rejestru. Zobacz marker-based triggering w dokumentacji logowania. Możesz również łączyć poziomy rejestrów i znaczniki do wyzwalania.

  2. Filtrowanie: Można na przykład koloru/oznaczyć wszystkie dzienniki utrwalania związanych (w różnych wersjach i wielu plikach klasa) z kolorem „DB”. Następnie można filtrować dla "DB": wyłączanie rejestrowania, z wyjątkiem instrukcji dziennika oznaczonych DB. Zobacz chapter on filters w dokumentacji rejestrowania po więcej informacji (wyszukaj MarkerFilter).

6

tylko jako dodatek, jeśli używasz logstash i zostały włączone rejestrowanie json, istnieje inny potencjalny wykorzystanie Marker - dla zmiennych rejestrowania skojarzyć z konkretnym przekazem dziennika. Jest to bardziej spójne i łatwiejsze do przeanalizowania niż włączenie do treści wiadomości. Bardzo przydatne, jeśli pasuje do twojego przypadku użycia.

Zobacz szczegóły tutaj:

https://github.com/logstash/logstash-logback-encoder#loggingevent_custom_event