Najlepsze praktyki dotyczące używania markerów w SLF4J / Logback

127

Używamy kombinacji SLF4J + Logback w naszym projekcie od jakiegoś czasu i jesteśmy z niej całkiem zadowoleni, ale nasza strategia logowania jest dość prosta, wykorzystując proste loggery oparte na klasach i bez wymyślnych rzeczy, takich jak MDC lub Markery.

Chcę wiedzieć, czy ktoś w społeczności faktycznie korzysta z tych funkcji i jak są one wykorzystywane do ulepszania logowania / filtrowania.

Jestem szczególnie zainteresowany tym, gdzie, dlaczego i jak można używać [1] Markerów do logowania. Wydaje mi się, że jest to całkiem fajna funkcja dodawania kontekstu semantycznego do logowania - np. Podczas gdy klasa może obsługiwać wiele problemów, można użyć znaczników specyficznych dla zadania / obawy, aby rozróżnić zapisy dziennika.

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

Aktualizacja: Wydaje mi się, że tak naprawdę nie chodzi mi o to, dlaczego używać znaczników, ale raczej o to, w jaki sposób - czy są jakieś dobre praktyki nazywania znaczników (np. Używanie zwykłego tekstu ze spacjami lub nazwami słów kluczowych rozdzielanymi myślnikami / podkreśleniem / interpunkcją ), czy powinna istnieć jakaś pula „standardowych nazw”, nazywających rzeczy w oparciu o funkcje biznesowe. Pytania, które prawdopodobnie potrafię sobie sam wymyślić, ale jeśli chcę systematycznie korzystać z tych funkcji i przedstawiać je zespołowi programistów, sensowne jest posiadanie jakiegoś sformalizowanego zestawu wskazówek dotyczących ...


[1] - Pytając, jak używać markerów, tak naprawdę nie pytam, jak używać API (jest to naprawdę dość proste) - odnoszę się raczej do bardziej ogólnego poziomu, jak można skonfigurować logowanie przy użyciu konsekwentnie markerów

Roland Tepp
źródło

Odpowiedzi:

98

Po pierwsze, jak powiedział @darioo:

  • MDC służy do łączenia wielu wydarzeń z kilkoma „jednostkami”
  • [Znaczniki] są używane do „specjalnych” wydarzeń, które chcesz odfiltrować od zwykłych

Więc twoje twierdzenie, że chcesz do tego użyć MDC. Znaczniki służą do podświetlania „specjalnych” wydarzeń - jeśli wolisz - filtrowania - zamiast do „wycinania”. Na przykład możesz wyciąć na plasterki na podstawie konkretnego użytkownika, ale filtrować na podstawie wszelkich nieoczekiwanych wyjątków. W takim przypadku należy utworzyć wymiar MDC użytkownika i znacznik nieoczekiwanego wyjątku.


Ale to najwyraźniej nie odpowiada na pytanie, które miałeś na myśli. Masz raczej na myśli bardziej ogólny poziom, w jaki sposób można skonfigurować logowanie przy użyciu konsekwentnych znaczników. Więc zajmijmy się tym:

MDC służy do krojenia i krojenia w kostkę , a znaczniki do filtrowania . Czynności te są wykonywane podczas testów i podczas produkcji . W związku z tym musisz zdecydować, które wymiary mogą być przydatne do podzielenia danych dziennika i do jakich przypadków może być przydatne ich filtrowanie, gdy pojawi się testowanie / produkcja. Każdy wymiar otrzymuje wymiar MDC. Każda sprawa otrzymuje znacznik. To takie proste.

Deweloperzy nie muszą tutaj podejmować żadnych decyzji. Pojedyncza osoba lub zespół powinien zdecydować w czasie projektowania , jaki rodzaj krojenia, krojenia w kostkę i filtrowania wymaga obsługi. Należy o tym poinformować, wyobrażając sobie, jakiego rodzaju zadań analitycznych oczekuje się od nich wykonania.

Ta sama osoba lub zespół powinna zdecydować o konwencji nazewnictwa. To jest całkowicie arbitralne . Wybierz coś, co jest przyjemne pod względem estetycznym, samoopisujące (najważniejsze) i na tyle konkretne, że nie będzie konfliktu z późniejszymi dodatkami. Myślniki vs. podkreślenia jest niezmiernie nitpicky i alarmująco obok punktu, ale należy pamiętać, to może być mniej mylące dla pracowników ESL czytać podkreślenia (przynajmniej w porównaniu do CamelCase); Jednocześnie podobno denerwuje to niektórych programistów ze względu na niezręczność w dostępie do wymaganych kluczy.

Jeśli chodzi o podjęcie decyzji w sprawie polityki, oznacza to po prostu zdefiniowanie, w jakich przypadkach należy zastosować dany wymiar Marker lub MDC . Trzymaj się tego ściśle (scentralizowane, celowe), ale pozwól na informacje zwrotne od programistów, jeśli uważają, że zestaw wymiarów i znaczników jest niewystarczający do wykonania zadania. W razie potrzeby popraw / dodaj wymiary i / lub atrybuty.

Zrozum, że ta polityka będzie prawie zawsze zależała od projektu . Nie każdy projekt wymaga tego samego rodzaju analizy logowania. Wyobraź sobie koszmarne scenariusze. Następnie wyobraź sobie, jak chciałbyś móc analizować dzienniki w tym scenariuszu. Prawdopodobnie nie chcesz pisać skomplikowanego skryptu, aby spróbować śledzić, która wiadomość należy do jakiego kontekstu i który stan jest w jakim czasie, prawda? Zakoduj wszystkie potrzebne informacje, takie jak wymiary i znaczniki, i oszczędzaj sobie kłopotów, jeśli coś pójdzie nie tak.

user359996
źródło
7
Świetna odpowiedź. Twierdzę, że MDC, który jest strukturą danych opartą na wątkach, może być również używany do filtrowania.
Ceki
Świetna odpowiedź. Ale kim jest pracownik ESL ?
DerMike
Dziękuję Ci. Angielski jako drugi język.
user359996
76

Po pierwsze, MDC.

MDC jest naprawdę przydatne w środowisku, w którym masz jedną „jednostkę” powiązaną z pewnym zachowaniem. Typowy przykład: interakcja użytkownika z aplikacją internetową. Załóżmy więc, że masz wielu użytkowników bawiących się Twoją aplikacją internetową. Korzystając z MDC, możesz łatwo je śledzić bez większych kłopotów. 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: jako nazwa użytkownika i jako identyfikator sesji. W ten sposób możesz łatwo grepować sesję jednego użytkownika, aby zobaczyć wszystko, co robili.

Po drugie, markery.

Znaczniki są zwykle używane w „szczególnych” okolicznościach, takich jak wysłanie wiadomości e-mail do administratora w przypadku poważnych krytycznych błędów. Nie wszystkie błędy zawsze należą do tej samej kategorii; z niektórymi trzeba postępować w odpowiedni sposób.

Lub, gdy użytkownik opuszcza twoją usługę, zwykle przechodzi do dziennika INFO, ale możesz również użyć znacznika dla takich instancji, jeśli chcesz, aby zdarzenia takie jak to były zapisywane w osobnym pliku dziennika, abyś mógł to monitorować łatwiejsze do statystycznego gromadzenia liczby rezygnujących użytkowników.

Praktyczna zasada:

  • MDC służy do łączenia wielu wydarzeń z kilkoma „jednostkami”
  • znaczniki są używane do „specjalnych” wydarzeń, które chcesz odfiltrować od zwykłych
darioo
źródło
3
To dobra odpowiedź, ale obejmuje tylko jeden możliwy przypadek użycia markerów. Widzę to, że istnieją funkcje struktury rejestrowania (takie jak MDC i Markery), które zapewniają więcej metadanych do późniejszego dzielenia i dzielenia dzienników (takich jak e-mail administratora lub osobne przypadki rejestrowania, o których wspomniałeś). Wydaje mi się, że zależało mi na tym, jak dokładnie stworzyć markery (czy powinna istnieć „standardowa pula” markerów, czy są jakieś konwencje nazewnictwa, o których należy pamiętać itp.)
Roland Tepp
3
@Roland: Dodałem kilka przykładów, ale nie mogę dodać wszystkich przykładów, ponieważ z definicji są one nieograniczone. Jeśli rozumiesz motywację i powód stosowania znaczników, to ich używanie jest ograniczone jedynie wyobraźnią i zdrowym rozsądkiem.
darioo
32

Markerów można używać do pokolorowania lub oznaczenia pojedynczego wyciągu dziennika. To, co zrobisz z tymi kolorami, czyli markerami, zależy wyłącznie od Ciebie. Jednak wydaje się, że dwa wzorce są wspólne (pierwszy bardziej powszechny niż drugi) do użycia markera.

  1. Wyzwalanie : Niektórym aplikantom można poinstruować, aby podjęli działanie w obecności określonego znacznika. Na przykład SMTPAppendermożna skonfigurować wysyłanie wiadomości e-mail za każdym razem, gdy zdarzenie rejestrowania jest oznaczone NOTIFY_ADMINznacznikiem, niezależnie od poziomu dziennika. Zobacz wyzwalanie oparte na znacznikach w dokumentacji logowania. Możesz także łączyć poziomy dziennika i znaczniki do wyzwalania.

  2. Filtrowanie : Możesz na przykład pokolorować / oznaczyć wszystkie dzienniki związane z trwałością (w różnych i wielu plikach klas) kolorem „DB”. Możesz wtedy filtrować według „DB”: wyłącz rejestrowanie z wyjątkiem instrukcji dziennika oznaczonych jako DB. Aby uzyskać więcej informacji, zapoznaj się z rozdziałem o filtrach w dokumentacji dziennika zwrotnego (wyszukaj MarkerFilter).

Ceki
źródło
11

Podobnie jak dodatek, jeśli używasz logstash i masz włączone rejestrowanie json, istnieje inne potencjalne zastosowanie Markera - do rejestrowania zmiennych w celu powiązania z określonym komunikatem dziennika. Jest to bardziej spójne i łatwiejsze do przeanalizowania niż włączenie go 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

Mark D.
źródło