Jak wysłać Javę.util.logowanie do log4j?

Mam już istniejącą aplikację, która wykonuje wszystkie swoje logowania na log4j. używamy wielu innych bibliotek, które również używają log4j, lub logowania na Commons, które kończy się logowaniem log4j pod osłonami w naszym środowisku. Jedna z naszych zależności loguje się nawet przeciwko slf4j, co również działa dobrze, ponieważ ostatecznie deleguje się również do log4j.

Teraz chciałbym dodać ehcache do tej aplikacji dla niektórych potrzeb buforowania. Poprzednie wersje ehcache używały commons-logging, co by w tym scenariuszu działało idealnie, ale od w wersji 1.6-beta1 usunęli zależność od commons-logging i zastąpili ją Javą.util.zamiast tego logowanie.

Nie jest zbytnio zaznajomiony z wbudowanym logowaniem JDK dostępnym w Javie.util.logging, czy istnieje łatwy sposób, aby wszelkie wiadomości log wysłane do JUL były zalogowane na log4j, więc mogę użyć mojej istniejącej konfiguracji i skonfigurować dla każdego logowania pochodzącego z ehcache?

Patrząc na javadocs dla JUL, wygląda na to, że mógłbym ustawić kilka zmiennych środowiskowych, aby zmienić implementację LogManager i być może użyć jej do zawinięcia log4j Logger S w klasie JUL Logger. Czy to właściwe podejście?

Trochę ironiczne, że korzystanie z wbudowanego logowania JDK przez Bibliotekę sprawiłoby taki ból głowy, gdy (większość) świata zamiast tego korzysta z bibliotek innych firm.

Author: Jim Ferrans, 2009-05-15

7 answers

Jedną z metod, z których korzystałem z powodzeniem, jest użycie slf4j jako podstawowego interfejsu API logowania. Następnie mam slf4j bind do log4j. 3rd party zależności przy użyciu innych frameworków (jak JUL) mogą być bridged do slf4j.

 36
Author: overthink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-15 17:59:53

Używamy SLF4J w naszym obecnym projekcie i to działa 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 API logowania SLF4J i konfigurujemy SLF4J tak, aby wywołania z Jakarta Commons Logging (JCL), java.util.logging (JUL) i Log4J interfejsy API są połączone z interfejsami API SLF4J. Musimy to zrobić, ponieważ podobnie jak ty korzystamy z bibliotek stron trzecich (open source), które wybrały różne interfejsy API logowania.

Na spodzie SLF4J konfigurujesz go tak, aby używał konkretnej implementacji loggera. Jest dostarczany z wewnętrznym lub" prostym " rejestratorem i można go zastąpić za pomocą Log4J, JUL lub Logback . Konfiguracja odbywa się po prostu przez upuszczenie różnych plików jar w ścieżce classpath.

Pierwotnie korzystaliśmy z implementacji Logback, również napisanej przez Ceki Gülcü. To jest bardzo potężne. Jednak wtedy zdecydowaliśmy się wdrożyć naszą aplikację do Glassfish Serwer aplikacji Java EE, którego przeglądarka logów oczekuje komunikatów w formacie JUL. Tak więc dzisiaj przesiadłem się z Logback na JUL i w ciągu zaledwie kilku minut wymieniłem dwa słoiki Logback NA SŁOIK SLF4J, który łączy go z implementacją JUL.

Tak jak @overhink, serdecznie polecam użycie SLF4J w konfiguracji.

 18
Author: Jim Ferrans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 03:34:45

Istnieje prostsza alternatywa od SLF4J do pomostu JUL z log4j, Zobacz http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Wystarczy umieścić Jul-log4j-bridge na classpath i dodać właściwość systemową:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

Jul-log4j-bridge nie jest w Maven Central i może być pobrany 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żywane 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>

Jest również możliwe, aby odbudować go ze źródeł z następujących kroki:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. edytuj pom.xml, zamień zależność od log4j:log4j: 1.2.15 na log4j: apache-log4j-extras: 1.2.17 i usuń zależność od Apache-log4j-component
  3. mvn package
 12
Author: Emmanuel Bourg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 08:26:31

Październik 2014

Od wersji 2.1 log4j istnieje komponent log4j-jul, który pozwala dokładnie na to. Mimo to, jeśli używasz log4j 1, musi być możliwe uaktualnienie do log4j2, aby skorzystać z tego podejścia.

JDK Logging Adapter

Class LogManager

Migracja z log4j 1.x do log4j 2

 6
Author: AdrianRM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-10 14:47:17

Strona slf4j chyba ma mostek do przekazywania Javy.util.rejestrowanie zdarzeń przez slf4j (a więc do log4j).

Tak, SLF4J download zawiera jul-to-slf4j, który moim zdaniem właśnie to robi. Zawiera Jul handler do przekazywania rekordów do SLF4J.

 3
Author: araqnid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-15 17:48:14

@Yishai-dzięki za wrzucenie linku do mojej wiki. Przykład przekierowuje JUL do Log4J i mam go uruchomiony w systemie produkcyjnym od kilku lat. JBoss 5x już przekierowuje JUL do Log4J, więc wyjąłem go po aktualizacji. Mam nowszy, który przekierowuje do SLF4J, którego używam teraz na kilku rzeczach. Opublikuję to, kiedy będę miał okazję.

Jednak SLF4J już go ma:

Http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j

 2
Author: Joshua Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-21 17:36:19

Należy ręcznie dodać blow przy starcie

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

Demo - > https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

 0
Author: jiahut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 10:00:36