Come inviare java.util.logging a log4j?


84

Ho un'applicazione esistente che esegue tutte le registrazioni su log4j. Usiamo una serie di altre librerie che usano anche log4j, o log contro Commons Logging, che finisce per usare log4j sotto le coperte nel nostro ambiente. Una delle nostre dipendenze registra anche contro slf4j, che funziona anche bene poiché alla fine delega anche a log4j.

Ora, vorrei aggiungere ehcache a questa applicazione per alcune esigenze di memorizzazione nella cache. Le versioni precedenti di ehcache utilizzavano il registro dei comuni, che avrebbe funzionato perfettamente in questo scenario, ma a partire dalla versione 1.6-beta1 hanno rimosso la dipendenza dal registro dei comuni e lo hanno sostituito con java.util.logging.

Non avendo molta familiarità con la registrazione JDK integrata disponibile con java.util.logging, c'è un modo semplice per avere tutti i messaggi di log inviati a JUL registrati su log4j, così posso usare la mia configurazione esistente e impostare per qualsiasi registrazione in arrivo da ehcache?

Guardando i javadoc per JUL, sembra che potrei impostare un gruppo di variabili di ambiente per cambiare l' LogManagerimplementazione utilizzata, e forse usarlo per racchiudere log4j Loggernella Loggerclasse JUL . È questo l'approccio corretto?

È abbastanza ironico che l'uso da parte di una libreria della registrazione JDK incorporata causi un tale mal di testa quando (la maggior parte del) resto del mondo utilizza invece librerie di terze parti.

Risposte:


37

Un approccio che ho utilizzato con successo è quello di utilizzare slf4j come API di registrazione principale. Quindi devo legare slf4j a log4j. Le dipendenze di terze parti che utilizzano altri framework (come JUL) possono essere collegate a slf4j.


2
Buon collegamento, ma penso che intendessi # jul-to-slf4j
araqnid

Sembra un buon approccio, tranne che non riesco a farlo funzionare :(
matt b

2
Inoltre, non posso credere che una libreria così popolare come ehcache possa passare a qualcosa come java.util.logging - sembra molto ossessivo
matt b

1
@matt b, JUL è sempre presente nel runtime Java, quindi richiede il minor numero di dipendenze esterne. È, tuttavia, ai miei occhi un vero esempio di codice scritto da persone non esperte nell'uso di quel codice. Il sistema di configurazione è piuttosto scomodo.
Thorbjørn Ravn Andersen,

1
Il problema che hai è che se colleghi SLF4J a JUL, le prestazioni di registrazione sono spaventose. In particolare, ogni riga di registro creata genera un'eccezione per determinare quale contesto di registrazione utilizzare. Ciò crea un sacco di overhead e rallenta i processi
Egwor

19

Usiamo SLF4J nel nostro progetto attuale e ha funzionato molto bene per noi. SLF4J è stato scritto da Ceki Gülcü, il creatore di Log4J, e ha fatto davvero un ottimo lavoro. Nel nostro codice utilizziamo direttamente le API di registrazione SLF4J e configuriamo SLF4J in modo che le chiamate dalle API Jakarta Commons Logging (JCL), java.util.logging (JUL) e Log4J siano tutte collegate alle API SLF4J. Dobbiamo farlo perché come te utilizziamo librerie di terze parti (open source) che hanno scelto API di registrazione diverse.

Nella parte inferiore di SLF4J, configurarlo per utilizzare una particolare implementazione del logger. Viene fornito con un logger interno o "semplice" ed è possibile sovrascriverlo con Log4J, JUL o Logback . La configurazione viene eseguita semplicemente inserendo diversi file jar nel percorso di classe.

In origine, abbiamo utilizzato l'implementazione Logback, anch'essa scritta da Ceki Gülcü. Questo è molto potente. Tuttavia, abbiamo quindi deciso di distribuire la nostra applicazione sul server delle applicazioni Java EE Glassfish, il cui visualizzatore di log prevede messaggi in formato JUL. Così oggi sono passato da Logback a JUL e in pochi minuti ho sostituito due jar Logback con un jar SLF4J che lo collega all'implementazione di JUL.

Quindi, come @overthink, consiglio vivamente di utilizzare SLF4J nella tua configurazione.


8
Quante volte Ceki ha bisogno di reinventare un framework / fascade di registrazione?
mP.

@mP: La registrazione potrebbe non essere affascinante, ma è un'esigenza cruciale per software di livello commerciale su larga scala. E SLF4J risolve il problema dell'integrazione del codice che utilizza framework di registrazione disparati (reso più urgente dalla scelta di Sun di sviluppare java.utils.logging invece di adottare Log4J).
Jim Ferrans

3
@mP, slf4j era necessario perché il pessimo lavoro che Sun ha fatto con JUL. Logback è un fork di log4j, non un nuovo progetto.
Thorbjørn Ravn Andersen

3
Ho trovato il logback necessario, se non altro, non è Apache, ed è effettivamente documentato.
Spencer Kormos

13

Esiste un'alternativa più semplice di SLF4J per collegare JUL con log4j, vedere http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

Devi solo mettere il jul-log4j-bridge sul classpath e aggiungere una proprietà di sistema:

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

jul-log4j-bridge non si trova in Maven Central e può essere recuperato da questo repository:

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

e poi utilizzato con:

<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>

È anche possibile ricostruirlo dai sorgenti con i seguenti passaggi:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. modifica pom.xml, sostituisci la dipendenza da log4j: log4j: 1.2.15 con log4j: apache-log4j-extras: 1.2.17 e rimuovi la dipendenza da apache-log4j-component
  3. pacchetto mvn

4
Penso che sia più semplice perché può essere fatto senza modificare il codice, devi solo aggiungere una proprietà di sistema. SLF4J non propone ancora un meccanismo simile, puoi modificare il codice o il logging.propertiesfile.
Emmanuel Bourg

1
Questo non esiste in log4j2, sfortunatamente :(
BeepDog

JulLog4jBridge.assimilate();o_0
Bastian Voigt

2
AVVERTIMENTO! jul-log4j-bridgeusa il apache-log4j-companionsbundle mai rilasciato (un backport da abbandonato log4j 1.3). Avrai difficoltà a costruirlo. Naturalmente, anche il bridge stesso viene abbandonato prima del rilascio.
ivan_pozdeev

@ivan_pozdeev Buon punto, grazie. Ho aggiunto le istruzioni per costruirlo.
Emmanuel Bourg

9

OTTOBRE 2014

Dalla versione 2.1 di log4j esiste il componente log4j-jul, che consente esattamente questo. Tuttavia, nel caso in cui si utilizzi log4j 1, deve essere possibile eseguire l'aggiornamento a log4j2 per utilizzare questo approccio.

Adattatore di registrazione JDK

Class LogManager

Migrare da log4j 1.x a log4j 2


2
A partire da ora (metà 2018) questa dovrebbe essere la risposta accettata
rmuller

Per i futuri lettori: confermo che funziona. Quindi, fondamentalmente (1) aggiungi questo al tuo pom mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jul e (2) aggiungi la proprietà di sistema nel primo collegamento (ad esempio, nei parametri JVM aggiungi -Djava. util.logging.manager = org.apache.logging.log4j.jul.LogManager)
Hossam El-Deen

3

Il sito slf4j credo abbia un ponte per il passaggio di eventi java.util.logging tramite slf4j (e quindi a log4j).

Sì, il download di SLF4J contiene jul-to-slf4j che credo faccia proprio questo. Contiene un gestore JUL per passare i record a SLF4J.


2

@Yishai - Grazie per aver postato il link al mio wiki. L'esempio qui reindirizza JUL a Log4J e l'ho tenuto in esecuzione in un sistema di produzione per alcuni anni. JBoss 5.x reindirizza già JUL a Log4J, quindi l'ho rimosso quando abbiamo aggiornato. Ne ho uno più recente che reindirizza a SLF4J, che ora uso su alcune cose. Lo posterò quando ne avrò la possibilità.

Tuttavia, SLF4J lo ha già:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.