Struktura rejestrowania Java - Java logging framework

Struktura rejestrowania Java to pakiet do rejestrowania danych komputerowych dla platformy Java . W tym artykule omówiono struktury rejestrowania ogólnego przeznaczenia.

Rejestrowanie odnosi się do rejestrowania aktywności aplikacji i jest częstym problemem zespołów programistycznych. Struktury rejestrowania ułatwiają i standaryzują proces rejestrowania na platformie Java. W szczególności zapewniają elastyczność, unikając jawnego wyjścia na konsolę (patrz Appender poniżej). Miejsce, w którym zapisywane są dzienniki, staje się niezależne od kodu i można je dostosować w czasie wykonywania.

Niestety, JDK nie zawierał logowania w swojej oryginalnej wersji, więc zanim dodano Java Logging API, kilka innych platform rejestrowania stało się szeroko używanych - w szczególności Apache Commons Logging (znany również jako Java Commons Logging lub JCL) i log4j . Doprowadziło to do problemów podczas integracji różnych bibliotek innych firm (JAR), z których każda używa różnych struktur rejestrowania. Aby rozwiązać ten problem, opracowano dołączalne struktury rejestrowania (opakowania).

Przegląd funkcjonalności

Rejestrowanie jest zwykle podzielone na trzy główne części: Logger, Formatter i Appender (lub Handler).

  • Rejestrator jest odpowiedzialny za przechwycenie komunikatu, który ma zostać zarejestrowany, wraz z określonymi metadanymi i przekazanie go do struktury rejestrowania.
  • Po odebraniu wiadomości framework wywołuje program Formatter z komunikatem, który formatuje go do wyjścia.
  • Struktura następnie przekazuje sformatowaną wiadomość do odpowiedniego programu Appender / Handler do dyspozycji. Może to obejmować dane wyjściowe do wyświetlacza konsoli, zapisywanie na dysku, dołączanie do bazy danych lub generowanie wiadomości e-mail.

Prostsze struktury rejestrowania, takie jak platforma rejestrowania utworzona przez Object Guy , łączą rejestrator i moduł dołączający. Upraszcza to domyślną operację, ale jest mniej konfigurowalne, zwłaszcza jeśli projekt jest przenoszony między środowiskami.

Logger

Rejestrator to obiekt, który umożliwia aplikacji logowanie bez względu na to, gdzie dane wyjściowe są wysyłane / przechowywane. Aplikacja rejestruje komunikat, przekazując obiekt lub obiekt i wyjątek z opcjonalnym poziomem ważności do obiektu rejestrującego pod określoną nazwą / identyfikatorem.

Nazwa

Logger ma nazwę. Nazwa ma zwykle strukturę hierarchiczną, z kropkami (.) Oddzielającymi poziomy. Typowym schematem jest użycie nazwy klasy lub pakietu, który wykonuje rejestrowanie. Zarówno log4j, jak i interfejs API logowania w języku Java obsługują definiowanie programów obsługi znajdujących się wyżej w hierarchii.

Na przykład rejestrator może nosić nazwę „ com.sun.some.UsefulClass ”. Procedurę obsługi można zdefiniować dla dowolnej z następujących czynności:

  • com
  • com.sun
  • com.sun.some
  • com.sun.some.UsefulClass

Tak długo, jak istnieje procedura obsługi zdefiniowana gdzieś na tym stosie, może wystąpić logowanie. Na przykład komunikat zarejestrowany w programie com.sun.some.UsefulClass rejestrującym może zostać zapisany przez program com.sun obsługi. Zwykle istnieje globalna procedura obsługi, która odbiera i przetwarza komunikaty generowane przez dowolny program rejestrujący.

Poziom ważności

Wiadomość jest rejestrowana na pewnym poziomie. Nazwy wspólnych poziomów są kopiowane z Apache Commons Logging (chociaż interfejs API Java Logging definiuje różne nazwy poziomów):

Wspólne poziomy
Poziom Opis
FATALNY Poważne błędy, które powodują przedwczesne zakończenie. Spodziewaj się, że będą one natychmiast widoczne w konsoli stanu.
BŁĄD Inne błędy w czasie wykonywania lub nieoczekiwane warunki. Oczekuj, że będą one natychmiast widoczne w konsoli stanu.
OSTRZEŻENIE Korzystanie z przestarzałych interfejsów API, słabe wykorzystanie interfejsu API, „prawie” błędy, inne sytuacje w czasie wykonywania, które są niepożądane lub nieoczekiwane, ale niekoniecznie „złe”. Spodziewaj się, że będą one natychmiast widoczne w konsoli stanu.
INFO Ciekawe zdarzenia w czasie wykonywania (uruchamianie / zamykanie). Spodziewaj się, że będą one natychmiast widoczne na konsoli, więc zachowaj ostrożność i ograniczaj do minimum.
ODPLUSKWIĆ szczegółowe informacje o przepływie przez system. Oczekuj, że będą one zapisywane tylko w dziennikach.
ŚLAD bardziej szczegółowe informacje. Oczekuj, że będą one zapisywane tylko w dziennikach.

Struktura rejestrowania utrzymuje bieżący poziom rejestrowania dla każdego programu rejestrującego. Poziom rejestrowania można ustawić bardziej lub mniej restrykcyjnie. Na przykład, jeśli poziom rejestrowania jest ustawiony na „WARNING”, rejestrowane są wszystkie komunikaty tego poziomu lub wyższego: ERROR i FATAL.

Poziomy ważności można przypisać zarówno do programu rejestrującego, jak i dopisującego. Aby dane wyjściowe zostały wygenerowane, oba muszą być włączone dla danego poziomu istotności. Zatem program rejestrujący z włączoną obsługą wyjścia debugowania nie wygeneruje danych wyjściowych, jeśli program obsługi, który otrzymuje komunikat, nie jest również włączony do debugowania.

Filtry

Filtry powodują, że zdarzenie dziennika jest ignorowane lub rejestrowane. Najczęściej stosowanym filtrem jest poziom rejestrowania opisany w poprzedniej sekcji. Struktury rejestrowania, takie jak Log4j 2 i SLF4J, również zapewniają markery, które po dołączeniu do zdarzenia dziennika mogą być również używane do filtrowania. Filtry mogą być również używane do akceptowania lub odrzucania zdarzeń dziennika na podstawie zgłaszanych wyjątków, danych w komunikacie dziennika, danych w ThreadLocal, które są ujawniane za pośrednictwem interfejsu API rejestrowania, lub wielu innych metod.

Elementy formatujące, układy lub programy renderujące

Formatter to obiekt, który formatuje dany obiekt. Przeważnie polega to na pobraniu obiektu binarnego i przekształceniu go w reprezentację w postaci łańcucha. Każda struktura definiuje domyślny format wyjściowy, który w razie potrzeby można zastąpić.

Appenders lub handlers

Programy dołączające nasłuchują wiadomości o określonym minimalnym poziomie ważności lub powyżej. Appender pobiera przekazaną wiadomość i odpowiednio ją umieszcza. Dyspozycje wiadomości obejmują:

  • wyświetlacz na konsoli
  • zapisz do pliku lub syslog
  • dołączyć do tabeli bazy danych
  • rozpowszechniać za pośrednictwem Java Messaging Services
  • wysłać e-mailem
  • napisz do gniazda
  • odrzucić do „wiadra bitowego” (/ dev / null)

Porównanie funkcji

Tabela 1 - Funkcje
Struktura Rodzaj Obsługiwane poziomy dziennika Standardowe dołączające Komentarze Koszt / licencja
Log4J Struktura rejestrowania FATAL ERROR WARN INFO DEBUG TRACE Zbyt wiele do wyświetlenia: zobacz dokumentację programu Appender Szeroko stosowany w wielu projektach i platformach. Log4j 1 został uznany za „End of Life” w 2015 r. I został zastąpiony przez Log4j 2, który zapewnia interfejs API, którego można używać z innymi implementacjami rejestrowania, a także implementacją tego interfejsu API.
Licencja Apache, wersja 2.0
Java Logging API Struktura rejestrowania SEVERE WARNING INFO CONFIG FINE FINER FINEST Domyślna wirtualna maszyna Java (JVM) firmy Sun ma następujące funkcje: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler Pochodzi z JRE
tinylog Struktura rejestrowania ERROR WARNING INFO DEBUG TRACE ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter i null (odrzuca wszystkie wpisy dziennika) Licencja Apache, wersja 2.0
Logback Struktura rejestrowania ERROR WARN INFO DEBUG TRACE Zbyt wiele do wyświetlenia: zobacz Appender JavaDoc Opracowany jako zamiennik log4j, z wieloma ulepszeniami. Używany w wielu projektach, zwykle za slf4j, na przykład Akka , Apache Camel , Apache Cocoon , Artifactory , Gradle , Lift Framework , Play Framework , Scalatra , SonarQube , Spring Boot , ... LGPL , wersja 2.1
Apache Commons Logging (JCL) Logging Wrapper FATAL ERROR WARN INFO DEBUG TRACE Zależy od podstawowej struktury Szeroko stosowany, często w połączeniu z log4j Licencja Apache, wersja 2.0
SLF4J Logging Wrapper ERROR WARN INFO DEBUG TRACE Zależy od podstawowej struktury, którą można podłączać. Zapewnia kompatybilne z API podkładki dla pakietów rejestrowania JCL, JDK i log4j. Może również użyć dowolnego z nich do wygenerowania wyniku. Domyślnie używa Logback do danych wyjściowych, jeśli jest dostępny. Szeroko stosowany w wielu projektach i platformach, często z Logback jako implementacją. Licencja MIT

Rozważania

JCL i Log4j są bardzo powszechne po prostu dlatego, że istnieją od tak dawna i przez długi czas były jedynymi wyborami. Elastyczność slf4j (z wykorzystaniem Logback pod spodem) sprawiła, że ​​stał się on popularnym wyborem.

SLF4J to zestaw opakowań rejestracyjnych (lub podkładek), które pozwalają im naśladować dowolne inne ramy. W ten sposób do aplikacji można włączyć wiele bibliotek innych firm, niezależnie od wybranej przez każdą z nich struktury rejestrowania. Jednak wszystkie dane wyjściowe rejestrowania są generowane w standardowy sposób, zwykle za pośrednictwem funkcji Logback.

Log4j 2 zapewnia zarówno interfejs API, jak i implementację. API może być kierowane do innych implementacji rejestrowania, równoważnych do sposobu działania SLF4J. W przeciwieństwie do SLF4J, Log4j 2 API rejestruje obiekty Message zamiast Strings dla dodatkowej elastyczności, a także obsługuje wyrażenia Java Lambda.

JCL nie jest tak naprawdę strukturą rejestrowania, ale opakowaniem dla jednego. W związku z tym wymaga struktury rejestrowania pod spodem, chociaż może domyślnie używać własnego programu SimpleLog rejestrującego.

JCL, SLF4J i Log4j 2 API są przydatne podczas tworzenia bibliotek wielokrotnego użytku, które wymagają zapisu w dowolnym podstawowym systemie rejestrowania używanym przez aplikację. Zapewnia to również elastyczność w środowiskach heterogenicznych, w których struktura rejestrowania prawdopodobnie ulegnie zmianie, chociaż w większości przypadków po wybraniu struktury rejestrowania nie ma potrzeby zmiany jej w trakcie trwania projektu. SLF4J i Log4j 2 czerpią korzyści z tego, że są nowsze i opierają się na wnioskach wyciągniętych ze starszych platform. Ponadto JCL ma znane problemy z programami ładującymi klasy podczas określania, którą bibliotekę logującą ma zawinąć, która teraz zastąpiła JCL.

Java Logging API jest dostarczana z Javą. Chociaż interfejs API jest technicznie oddzielony od domyślnej implementacji dostarczanej z Javą, zastąpienie go alternatywną implementacją może być trudne, więc wielu programistów myli tę implementację z Java Logging API. Konfiguracja odbywa się tylko za pomocą plików zewnętrznych, które nie są łatwe do zmiany w locie (inne frameworki obsługują konfigurację programową). Domyślna implementacja zapewnia tylko kilka programów obsługi i elementów formatujących, co oznacza, że ​​większość użytkowników będzie musiała napisać własne.

Zobacz też

Bibliografia

Linki zewnętrzne