Mam istniejącą aplikację, która wykonuje wszystkie swoje logowanie względem log4j. Korzystamy z wielu innych bibliotek, które albo używają log4j, albo logują się do Commons Logging, co kończy się użyciem log4j pod osłonami w naszym środowisku. Jedna z naszych zależności loguje nawet do slf4j, która również działa dobrze, ponieważ ostatecznie deleguje również do log4j.
Teraz chciałbym dodać ehcache do tej aplikacji na potrzeby buforowania. Poprzednie wersje ehcache wykorzystywały wspólne logowanie, które działałoby doskonale w tym scenariuszu, ale od wersji 1.6-beta1 usunęły one zależność od commons-logging i zamiast tego zastąpiły je java.util.logging.
Nie jestem zaznajomiony z wbudowanym rejestrowaniem JDK dostępnym w java.util.logging, czy istnieje łatwy sposób, aby jakiekolwiek komunikaty dziennika wysyłane do JUL były rejestrowane w log4j, więc mogę użyć mojej istniejącej konfiguracji i ustawić dla każdego nadchodzącego logowania z ehcache?
Patrząc na javadoc dla JUL, wygląda na to, że mógłbym ustawić kilka zmiennych środowiskowych, aby zmienić LogManager
używaną implementację, i być może użyć tego do zawijania log4j Logger
w Logger
klasie JUL . Czy to jest właściwe podejście?
To trochę ironiczne, że korzystanie przez bibliotekę z wbudowanego rejestrowania JDK powodowałoby taki ból głowy, gdy (większość) reszta świata zamiast tego korzysta z bibliotek innych firm.
Używamy SLF4J w naszym obecnym projekcie i działa to bardzo dobrze dla nas. SLF4J został napisany przez Ceki Gülcü, twórcę Log4J, i wykonał naprawdę świetną robotę. W naszym kodzie używamy bezpośrednio interfejsów API logowania SLF4J i konfigurujemy SLF4J tak, aby wywołania z Jakarta Commons Logging (JCL), java.util.logging (JUL) i Log4J API były połączone mostem z interfejsami API SLF4J. Musimy to zrobić, ponieważ podobnie jak Ty korzystamy z bibliotek innych firm (open source), które wybrały różne interfejsy API do logowania.
W dolnej części SLF4J konfigurujesz go tak, aby używał określonej implementacji rejestratora. Jest wyposażony w wewnętrzny lub „prosty” rejestrator, który można zastąpić za pomocą Log4J, JUL lub Logback . Konfiguracja odbywa się po prostu przez umieszczenie różnych plików jar w ścieżce klas.
Pierwotnie korzystaliśmy z implementacji Logback, również napisanej przez Ceki Gülcü. To jest bardzo potężne. Jednak zdecydowaliśmy się następnie wdrożyć naszą aplikację na serwerze aplikacji Glassfish Java EE, którego przeglądarka dziennika oczekuje komunikatów w formacie JUL. Więc dzisiaj przestawiłem się z Logback na JUL iw zaledwie kilka minut wymieniłem dwa słoiki Logback na słoik SLF4J, który łączy go z implementacją JUL.
Tak jak @overthink, serdecznie polecam użycie SLF4J w twojej konfiguracji.
źródło
Istnieje prostsza alternatywa dla połączenia JUL z log4j niż SLF4J, patrz http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html
Wystarczy umieścić most jul-log4j-bridge w ścieżce klas i dodać właściwość systemową:
jul-log4j-bridge nie znajduje się w Maven Central i można go pobrać z tego repozytorium:
<repository> <id>psmith</id> <url>http://people.apache.org/~psmith/logging.apache.org/repo</url> <releases> <enabled>false</enabled> </releases> </repository>
a następnie używany z:
<dependency> <groupId>org.apache.logging</groupId> <artifactId>apache-jul-log4j-bridge</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>test</scope> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>apache-log4j-component</artifactId> </exclusion> </exclusions> </dependency>
Możliwe jest również odbudowanie go ze źródeł, wykonując następujące kroki:
źródło
logging.properties
plik.JulLog4jBridge.assimilate();
o_0jul-log4j-bridge
używa nigdy nie wydanegoapache-log4j-companions
pakietu (backport z porzuconegolog4j 1.3
). Będzie ci ciężko go zbudować. Oczywiście sam most został również porzucony przed wydaniem.PAŹDZIERNIK 2014
Od wersji 2.1 log4j istnieje komponent log4j-jul, który dokładnie na to pozwala. Mimo to, jeśli używasz log4j 1, musi być możliwe uaktualnienie do log4j2, aby użyć tego podejścia.
Adapter rejestrowania JDK
Class LogManager
Migracja z log4j 1.x do log4j 2
źródło
Uważam, że witryna slf4j ma pomost do przekazywania zdarzeń java.util.logging przez slf4j (a tym samym do log4j).
Tak, plik do pobrania SLF4J zawiera jul-to-slf4j, co moim zdaniem robi właśnie to. Zawiera moduł obsługi JUL do przekazywania rekordów do SLF4J.
źródło
@Yishai - Dziękuję za umieszczenie linku do mojej wiki. Przykład tam przekierowuje JUL do Log4J i mam go uruchomionego w systemie produkcyjnym przez kilka lat. JBoss 5.x już przekierowuje JUL do Log4J, więc usunąłem go podczas aktualizacji. Mam nowszy, który przekierowuje do SLF4J, którego używam teraz w kilku rzeczach. Opublikuję to, kiedy będę miał okazję.
Jednak SLF4J już to ma:
http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j
źródło
należy ręcznie dodać dmuchanie przy starcie
demo -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d
źródło