Struktura rejestrowania Java
Platforma rejestrowania Java to pakiet rejestrowania danych komputerowych dla platformy Java . W tym artykule omówiono struktury rejestrowania ogólnego przeznaczenia.
Rejestrowanie odnosi się do rejestrowania aktywności przez aplikację i jest częstym problemem dla zespołów programistycznych. Ramy rejestrowania ułatwiają i standaryzują proces rejestrowania dla platformy Java. W szczególności zapewniają elastyczność, unikając jawnego wyjścia do konsoli (zobacz Appender poniżej). Miejsce zapisywania dzienników 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 do czasu dodania Java Logging API kilka innych frameworków rejestrowania stało się powszechnie używanych - w szczególności Apache Commons Logging (znany również jako Java Commons Logging lub JCL) i Log4j . Prowadziło to do problemów podczas integrowania różnych bibliotek innych firm (JAR), z których każda korzystała z różnych struktur rejestrowania. Aby rozwiązać ten problem, opracowano dołączane ramy rejestrowania (opakowania).
Przegląd funkcjonalności
Rejestrowanie jest zwykle podzielone na trzy główne części: Logger, Formatter i Appender (lub Handler).
- Logger jest odpowiedzialny za przechwycenie komunikatu do zarejestrowania wraz z pewnymi metadanymi i przekazanie go do struktury rejestrowania.
- Po otrzymaniu komunikatu struktura wywołuje Formatter z komunikatem, który formatuje go do danych wyjściowych.
- Struktura następnie przekazuje sformatowaną wiadomość do odpowiedniego Appender/Handler do dyspozycji. Może to obejmować wyświetlanie danych wyjściowych na konsoli, zapisywanie na dysku, dołączanie do bazy danych lub generowanie wiadomości e-mail.
Prostsze struktury rejestrowania, takie jak Logging Framework autorstwa Object Guy , łączą program rejestrujący i program dołączający. Upraszcza to domyślną operację, ale jest mniej konfigurowalne, zwłaszcza jeśli projekt jest przenoszony między środowiskami.
Rejestrator
Logger to obiekt, który umożliwia aplikacji logowanie bez względu na to, gdzie dane wyjściowe są wysyłane/przechowywane. Aplikacja loguje komunikat przekazując obiekt lub obiekt i wyjątek z opcjonalnym poziomem istotności do obiektu loggera pod zadaną nazwą/identyfikatorem.
Nazwa
Rejestrator 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 Java logging API obsługują definiowanie programów obsługi znajdujących się wyżej w hierarchii.
Na przykład rejestrator może mieć nazwę „ com.sun.some.UsefulClass
”. Program obsługi można zdefiniować dla dowolnej z następujących czynności:
kom
com.słońce
com.sun.some
com.sun.some.UsefulClass
Tak długo, jak gdzieś na tym stosie jest zdefiniowany program obsługi, może wystąpić rejestrowanie. Na przykład wiadomość zarejestrowana w com.sun.some.UsefulClass
może zostać zapisana przez moduł obsługi com.sun
. Zwykle istnieje globalny program obsługi, który odbiera i przetwarza komunikaty generowane przez dowolny program rejestrujący.
Poziom ciężkości
Wiadomość jest rejestrowana na określonym poziomie. Wspólne nazwy poziomów są kopiowane z Apache Commons Logging (chociaż interfejs Java Logging API definiuje różne nazwy poziomów):
Poziom | Opis |
---|---|
FATALNY | Poważne błędy powodujące przedwczesne zakończenie. Spodziewaj się, że będą one natychmiast widoczne na konsoli stanu. |
BŁĄD | Inne błędy w czasie wykonywania lub nieoczekiwane warunki. Spodziewaj się, że będą one natychmiast widoczne na konsoli stanu. |
OSTRZEŻENIE | Używanie przestarzałych interfejsów API, niewłaściwe korzystanie z 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 na konsoli stanu. |
INFORMACJE | Ciekawe zdarzenia uruchomieniowe (uruchamianie/zamykanie). Spodziewaj się, że będą one natychmiast widoczne na konsoli, więc zachowaj ostrożność i ogranicz je do minimum. |
ODPLUSKWIĆ | szczegółowe informacje o przepływie przez system. Spodziewaj się, że będą one zapisywane tylko w dziennikach. |
NAMIERZAĆ | bardziej szczegółowe informacje. Spodziewaj się, że będą one zapisywane tylko w dziennikach. |
Struktura rejestrowania utrzymuje bieżący poziom rejestrowania dla każdego rejestratora. Poziom rejestrowania można ustawić mniej lub bardziej restrykcyjnie. Na przykład, jeśli poziom rejestrowania jest ustawiony na „OSTRZEŻENIE”, rejestrowane są wszystkie komunikaty tego lub wyższego poziomu: BŁĄD i FATAL.
Poziomy istotności można przypisać zarówno do rejestratorów, jak i do programów dołączających. Oba muszą być włączone dla danego poziomu istotności, aby dane wyjściowe były generowane. Tak więc program rejestrujący z włączonym wyjściem debugowania nie wygeneruje wyjścia, jeśli moduł obsługi, który otrzyma komunikat, nie jest również włączony do debugowania.
Filtry
Filtry powodują ignorowanie lub rejestrowanie zdarzeń dziennika. Najczęściej używanym filtrem jest poziom rejestrowania opisany w poprzedniej sekcji. Ramy rejestrowania, takie jak Log4j 2 i SLF4J, zapewniają również znaczniki, które po dołączeniu do zdarzenia dziennika mogą być również używane do filtrowania. Filtrów można również używać do akceptowania lub odrzucania zdarzeń dziennika na podstawie zgłaszanych wyjątków, danych w komunikacie dziennika, danych w ThreadLocal, które są udostępniane za pośrednictwem interfejsu API rejestrowania, lub różnych innych metod.
Formatery, układy lub renderery
Formatter to obiekt, który formatuje dany obiekt. Głównie polega to na pobraniu obiektu binarnego i przekonwertowaniu go na reprezentację łańcuchową. Każda struktura definiuje domyślny format wyjściowy, który można przesłonić w razie potrzeby.
Dodatki lub programy obsługi
Programy dołączające nasłuchują komunikatów o określonym minimalnym poziomie istotności lub wyższym. Appender pobiera przekazaną wiadomość i odpowiednio ją publikuje. Dyspozycje wiadomości obejmują:
- wyświetlić na konsoli
- zapis do pliku lub syslog
- dołączyć do tabeli bazy danych
- rozpowszechniać za pośrednictwem Java Messaging Services
- wysłać e-mailem
- napisz do gniazdka
- odrzuć do „bit-bucket” (/dev/null)
Porównanie funkcji
Struktura | Typ | Obsługiwane poziomy dziennika | Standardowe dołączacze | Uwagi | Koszt / Licencja |
---|---|---|---|---|---|
Log4j | Struktura rejestrowania |
BŁĄD KRYTYCZNY OSTRZEŻENIE INFORMACJE DEBUGOWANIE ŚLEDZENIE
|
Zbyt wiele, by wymienić: Zobacz dokumentację programu dołączającego | Szeroko stosowany w wielu projektach i platformach. Log4j 1 został ogłoszony „End of Life” w 2015 roku 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
|
Interfejs API rejestrowania w języku Java | Struktura rejestrowania |
POWAŻNE OSTRZEŻENIE INFORMACJE KONFIGURACJA DOKŁADNIE DOKŁADNIEJ NAJLEPIEJ
|
Domyślna wirtualna maszyna Java firmy Sun (JVM) zawiera następujące komponenty: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler | W zestawie z JRE | |
malutkilog | Struktura rejestrowania |
INFORMACJE O BŁĘDZIE OSTRZEŻENIE DEBUGOWANIE ŚLEDZENIA
|
ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter i null (odrzuca wszystkie wpisy dziennika) | Licencja Apache, wersja 2.0 | |
Logowanie | Struktura rejestrowania |
INFORMACJE O BŁĘDZIE OSTRZEŻENIE DEBUGOWANIE ŚLEDZENIA
|
Zbyt wiele, by wymienić: zobacz Appender JavaDoc | Opracowany jako zamiennik Log4j, z wieloma ulepszeniami. Używany przez wiele projektów, zazwyczaj za slf4j, na przykład Akka , Apache Camel , Apache Cocoon , Artifactory , Gradle , Lift Framework , Play Framework , Scalatra , SonarQube , Spring Boot , ... | LGPL , wersja 2.1 |
Logowanie Apache Commons (JCL) | Opakowanie rejestrowania |
BŁĄD KRYTYCZNY OSTRZEŻENIE INFORMACJE DEBUGOWANIE ŚLEDZENIE
|
Zależy od podstawowej struktury | Szeroko stosowany, często w połączeniu z Log4j | Licencja Apache, wersja 2.0 |
SLF4J | Opakowanie rejestrowania |
INFORMACJE O BŁĘDZIE OSTRZEŻENIE DEBUGOWANIE ŚLEDZENIA
|
Zależy od podstawowej struktury, którą można podłączyć. 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 danych wyjściowych. 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 popularne po prostu dlatego, że istnieją od tak dawna i były jedynymi wyborami przez długi czas. Elastyczność slf4j (wykorzystywanie Logback pod spodem) sprawiła, że jest to popularny wybór.
SLF4J to zestaw okładek (lub podkładek) rejestrowania, które pozwalają mu naśladować dowolne inne frameworki. W ten sposób do aplikacji można włączyć wiele bibliotek innych firm, niezależnie od wybranej 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ę. Interfejs API można przekierować do innych implementacji rejestrowania odpowiadających temu, jak działa SLF4J. W przeciwieństwie do SLF4J, interfejs API Log4j 2 rejestruje obiekty komunikatów zamiast łańcuchów, co zapewnia dodatkową elastyczność, a także obsługuje wyrażenia Java Lambda.
JCL nie jest tak naprawdę platformą rejestrowania, ale opakowaniem dla niej. W związku z tym wymaga struktury rejestrowania pod nią, chociaż może domyślnie używać własnego SimpleLog
.
JCL, SLF4J i API Log4j 2 są przydatne podczas opracowywania bibliotek wielokrotnego użytku, które muszą zapisywać do dowolnego bazowego systemu rejestrowania używanego przez aplikację. Zapewnia to również elastyczność w środowiskach heterogenicznych, w których struktura rejestrowania może ulec zmianie, chociaż w większości przypadków po wybraniu struktury rejestrowania nie ma potrzeby jej zmiany w trakcie trwania projektu. SLF4J i Log4j 2 czerpią korzyści z tego, że są nowsze i opierają się na lekcjach wyciągniętych ze starszych frameworków. Co więcej, JCL ma znane problemy z modułami ładującymi klasy podczas określania, którą bibliotekę rejestrowania powinna zawijać, która teraz zastąpiła JCL.
Interfejs Java Logging API jest dostarczany z Javą. Chociaż interfejs API jest technicznie oddzielony od domyślnej implementacji dostarczanej z Javą, zastąpienie go alternatywną implementacją może być trudne, dlatego wielu programistów myli tę implementację z interfejsem Java Logging API. Konfiguracja odbywa się tylko za pomocą plików zewnętrznych, których nie można łatwo zmienić w locie (inne frameworki obsługują konfigurację programową). Domyślna implementacja zapewnia tylko kilka Handlerów i Formaterów, co oznacza, że większość użytkowników będzie musiała napisać własne.
Zobacz też
- SLF4J
- Log4j
- logowanie
- Javolution LogContext oparty na programowaniu kontekstowym (rzeczywista struktura rejestrowania do wyboru w czasie wykonywania).
- Inteligencja środowiska wykonawczego
Linki zewnętrzne
- Interfejs API rejestrowania Java 6.0
- Wspólne rejestrowanie
- Protomateria
- Narzędzia rejestrowania Open Source w Javie
- Licencja Apache 2.0.
- Logback - Następca popularnego projektu Log4j
- tinylog — minimalistyczne narzędzie do rejestrowania ze statycznym rejestratorem
- Loggifier Narzędzie, które wstawia kod logowania do plików .class, .jar i .ear
- JLV — przeglądarka dzienników Java, która jest obecnie dostępna jako wtyczka dla środowiska Eclipse IDE
- Perf4j
- SLF4J
- Log4j 2