Che succede con la registrazione in Java? [chiuso]


117

Perché uno dovrebbe usare uno dei seguenti pacchetti invece dell'altro?

  • Registrazione Java
  • Commons Logging
  • log4j
  • SLF4J
  • logback

4
Si potrebbe desiderare di stackoverflow.com/questions/873051 , che confronta SLF4J a Commons Logging.
James McMahon

24
Perché diavolo Ceki ha creato 3 framework di registrazione !!! questa è una follia ...
mP.

6
@mP. - log4j è stato il primo, poi è sorto il disaccordo e è stato scritto slf4j + logback. slf4j è l' API e effettua il logback dell'implementazione dell'API. Indipendentemente da tutto il resto, slf4j è estremamente utile.
Thorbjørn Ravn Andersen

3
Per i dettagli sul motivo per cui Ceki Gülcü ha creato SLF4J + Logback, vedere il seguente discorso di Devoxx
bitek

La cosa migliore che ne viene fuori è l'API slf4j che si spera unificherà il mondo del logging. Penso che il logback non abbia ancora raggiunto la massa critica con gli sviluppatori.
Thorbjørn Ravn Andersen

Risposte:


86

In ordine cronologico di apparenza api (per quanto ne so):

  • Log4j perché quasi tutti lo usano (nella mia esperienza)
  • Commons Logging perché i progetti open source lo utilizzano (in modo che possano integrarsi con qualsiasi framework di registrazione utilizzato nella soluzione integrata); particolarmente valido se sei un API / Framework / OSS e fai affidamento su altri pacchetti che utilizzano Commons Logging.
  • Commons Logging perché non vuoi "bloccarti" a un particolare framework di registrazione (quindi invece ti limiti a ciò che Commons Logging ti dà invece) - Non penso che sia ragionevole decidere di utilizzare questo punto come motivo.
  • Registrazione Java perché non vuoi aggiungere un jar extra.
  • SLF4j perché è più recente di Commons Logging e fornisce la registrazione parametrizzata:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Logback perché è più recente di log4j e, di nuovo, supporta la registrazione parametrizzata, poiché implementa direttamente SLF4j
  • SLF4j / Logback perché è scritto dallo stesso tizio che ha fatto log4j, quindi lo ha migliorato (secondo Ken G - grazie. Sembra che si adatti quando si guardano i loro precedenti post di notizie )
  • SLF4j perché pubblicano anche un adattatore log4j in modo da non dover "disattivare" log4j nel codice precedente - basta fare in modo che log4j.properties usi SLF4j e la sua configurazione

3
Per quanto ne so, l'idea alla base della registrazione dei comuni è che dovrebbe essere utilizzata nelle biblioteche. In questo modo la libreria può sempre utilizzare lo stesso framework di registrazione (tramite la registrazione comune) che utilizza l'applicazione di hosting.
Joachim Sauer

Grazie mille a Loki per la domanda. Ora so che non userò più log4j come framework predefinito. SLF4j FTW! Grazie anche a Ken G per aver sottolineato che SLF4j è stato scritto dallo stesso ragazzo di log4j
Stephen

3
Il commento nel tuo esempio di codice non è corretto al 100%. La formattazione effettiva del messaggio viene eseguita pigramente da Logback, quindi accadrà solo se l'evento è realmente gestito da un appender e l'appender richiede il messaggio formattato, cosa che non accadrebbe nel caso ad esempio di un SocketAppender poiché l'evento è serializzato utilizzando il modello di messaggio invariato + gli argomenti come stringhe. Immagino che dipenda solo da come definisci "efficacemente". Emetterebbe sicuramente lo stesso messaggio (almeno se la voce e l'oggetto sono gli stessi;)) quindi per favore perdona il mio pignolo.
Huxi

6
SLF4J in realtà è solo un'API che si trova in cima ad altri framework di registrazione. Simile all'obiettivo di Commons Logging, ma più intuitivo dalla mia esperienza.
James McMahon

37

Trovo che il login in Java sia confuso, incoerente, scarsamente documentato e soprattutto casuale. Inoltre, c'è un'enorme quantità di somiglianza tra questi framework di registrazione che si traduce in una duplicazione degli sforzi e nella confusione sull'ambiente di registrazione in cui ci si trova effettivamente. In particolare, se si lavora in uno stack di applicazioni web Java serio, ci si trova spesso in multiploregistrazione di ambienti contemporaneamente; (es. hibernate può usare log4j e tomcat java.util.logging). Apache commons ha lo scopo di collegare diversi framework di registrazione, ma in realtà aggiunge solo più complessità. Se non lo sai prima del tempo, è assolutamente sconcertante. Perché i miei messaggi di registro non vengono stampati sulla console, ecc.? Ohh perché sto guardando i log di Tomcat e non log4j. Aggiungendo ancora un altro livello di complessità, il server delle applicazioni potrebbe avere configurazioni di registrazione globali che potrebbero non riconoscere le configurazioni locali per una particolare applicazione web. Infine, tutti questi framework di registrazione sono TROPPO COMPLICATI. L'accesso a Java è stato un pasticcio disorganizzato che ha lasciato gli sviluppatori come me frustrati e confusi.

Le prime versioni di Java non avevano un framework di registrazione integrato che portava a questo scenario.


19
Questa è una risposta? Sembra più uno sproloquio.
Michael Myers

15
Mi dispiace. Si è un po 'di un rant. Ma è anche una risposta convincente a "Che succede con la registrazione in Java?". La risposta, in breve, è che è profondamente rotta.
Julien Chastang

1
beh, non vale un voto -1; P Ma qualcosa su cui riflettere.
guyumu

21
I problemi sono iniziati quando Sun ha effettivamente aggiunto java.util.logging a Java 1.4. Prima di allora LOG4J era ben consolidato e ampiamente utilizzato. Dopo di che c'era la necessità di wrapper per supportare sia LOG4J che java.util.logging. Inoltre, poiché jul è contenuto nel pacchetto java. *, Non può essere sostituito scambiando un JAR, che è il modo in cui SLF4J collega gli altri framework. Questa è stata probabilmente la peggiore idea di Sun mai vista ... e alla fine ha portato a supporre erroneamente che un "buon cittadino Java" dovrebbe usare jul.
Huxi

4
@ Huxi, ritengo che l'API di Calendar fosse peggiore. In difesa di Sun non era il loro codice, ma proveniva da Taglient.
Thorbjørn Ravn Andersen

22

C'è un punto importante che non è stato menzionato prima:

SLF4J (e sia Logback che LOG4J come backend di registrazione) supportano un cosiddetto Mapped Diagnostic Context (MDC, vedere javadoc e documentazione ).

Si tratta essenzialmente di una mappa <String, String> locale del thread che è possibile utilizzare per aggiungere ulteriori informazioni sul contesto all'evento di registrazione. Lo stato corrente dell'MDC è allegato a ogni evento.

Questo può essere incredibilmente utile se inserisci elementi come il nome utente e l'URL della richiesta (nel caso di una webapp). Questo può essere fatto automaticamente usando un filtro, per esempio.


2
Tecnicamente, è una mappa locale del thread <String, String>.
pdxleif


4

Nel nostro progetto aziendale utilizziamo LOG4j ed è molto facile da usare come ha mostrato Stephen nel suo esempio. Abbiamo anche scritto le nostre classi di pattern per LOG4j in modo da poter creare i propri schemi di file di output. Puoi descrivere come dovrebbe apparire il tuo file di log. È possibile migliorare le classi log4j originali.

Tutte le proprietà LOG4j possono essere modificate in un file log4j.properties, in modo da poter utilizzare file diversi per progetti diversi.

La registrazione di Java non è la mia preferita, ma potrebbe essere perché utilizzo log4j dall'inizio.


4

La panoramica di Commons Logging fornisce il motivo della sua esistenza: la registrazione dal codice della libreria, quando non si ha alcun controllo sul framework di registrazione sottostante. Molto importante per i vari progetti Apache, che saranno collegati ad applicazioni esterne. Forse non così importante per i progetti IT interni, dove hai il controllo completo.

Detto questo, scrivo a Commons Logging, come fanno molti altri sviluppatori che conosco. Il motivo è ridurre al minimo il bagaglio mentale: puoi cambiare progetto o lavoro e non devi imparare un nuovo quadro (a condizione che il nuovo lavoro / progetto utilizzi anche CL, e / o puoi convincerli a passare ad esso).

Inoltre, c'è un certo valore nel creare i propri wrapper attorno a qualsiasi framework si utilizzi. Come descritto qui , mi piace usare un oggetto LogWrapper per fornire una stringa personalizzata (importante) e ridurre al minimo l'ingombro visivo delle istruzioni di registrazione (meno importante).


1
C'è anche un bridge commons.logging => SLF4J che può essere utilizzato per instradare tutti i log di CL su SLF4J. SLF4J supporta il bridging di commons.logging, LOG4J e (un po 'ingombrante, ma il migliore possibile) java.util.logging in modo che tutti i log finiscano in qualsiasi backend SLF4J che userete. Vedi slf4j.org/legacy.html Userei Logback, btw, ma potresti sostenere che sono di parte.
Huxi

2

Generalmente userei per impostazione predefinita Log4J.

Userei Java Logging se non mi dispiacesse una dipendenza da Java 1.4, ma preferirei comunque Log4J.

Userei Commons Logging se stavo migliorando qualcosa che già lo usava.


Non ti dispiaceva una dipendenza da 1.4 ?? Anche la 1.4 ha raggiunto la fine della sua vita utile.
Tom Hawtin - tackline

2
@ Tom He significa jdk1.4 + non essere sciocco.
mP.

In realtà ho recentemente svolto un po 'di lavoro in un sistema che era ancora in esecuzione con jdk 1.3 :-(, ed è stato meno di due anni fa che stavo mantenendo un sistema jdk 1.2 . Troppi posti non si aggiornano a meno che non lo abbiano assolutamente a, si rifiutano semplicemente di installare gli aggiornamenti.
Michael Rutherfurd

0

Suggerirei di creare una sottile facciata di registrazione in grado di scrivere su qualsiasi framework di registrazione, a quel punto la scelta del motore di supporto diventa praticamente un punto controverso.


2
Questo è ciò che fa il disboscamento comune, quindi perché reinventare la ruota? Inoltre ci sono alcuni problemi che la tua facciata dovrebbe gestire che già fa il log dei comuni.
James AN Stauffer

+1 Per contrastare l'argomento di registrazione comune, alcune app aziendali utilizzano un logger personalizzato. È sempre una buona idea nascondere l'implementazione sottostante. L'involucro "sottile" elimina la necessità di confezionare un altro barattolo e non è tanto quanto reinventare.
questzen

1
Questo mi ha salvato di recente quando abbiamo portato il nostro framework in Compact Framework (in .Net). Se avessimo dipendenze hardcoded su nLog, saremmo stati fregati. Poiché abbiamo utilizzato questo approccio, siamo stati in grado di inserire un logger nullo ed essere felici. Qualcuno mi vota di nuovo a 0 Per favore :-)
tsimon

3
Ne esiste già uno: dai un'occhiata a slf4j. È un thin wrapper accettato che consente di cambiare framework di registrazione all'avvio dell'applicazione cambiando i jar sul percorso di classe di runtime.
deterb

1
l'intasamento ha il suo modo di scoprire quale framework utilizzerà: non è carino e piuttosto convulso. Quanti framework di registrazione ha creato Ceki. Si dovrebbe sempre sforzarsi di inserire un livello di interdirezione e nascondere un'implementazione anche se si intasa con la propria registrazione. Dietro le quinte puoi quindi collegare qualsiasi f / w desideri come menzionato da Travis.
mP.
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.