2010-04-30 11 views
10

Qual è il vantaggio di log4j sul set System.out e System.err per l'output in un file di registro?Vantaggio di log4j

+0

Io stesso penso che log4j presenti troppa complessità non necessaria. È anche molto invadente. Date un'occhiata a questo approccio alternativo che utilizza una classe di enumerazione come funzione di registrazione: http://mentalog.soliveirajr.com – TraderJoeChicago

risposta

12

Ad un livello elevato, la vincita da Log4j rispetto alla registrazione manuale è che è possibile disaccoppiare il proprio codice di registrazione da quello che si desidera effettivamente registrare e dove e come si desidera registrarlo. I dettagli sulla verbosità di registrazione/filtraggio, formattazione, posizione del registro e persino tipo di registro (file, rete, ecc.) Sono gestiti in modo dichiarativo utilizzando la configurazione ed estensivamente tramite custom appenders, piuttosto che è necessario codificare autonomamente tale flessibilità.

Questo è di fondamentale importanza perché è spesso difficile per gli sviluppatori prevedere come cambieranno le esigenze di registrazione una volta che il software sarà in produzione. I team operativi che gestiscono quel software potrebbero necessitare di log meno dettagliati, potrebbero aver bisogno di più log, potrebbero dover spedire i log a più server, potrebbe essere necessario ottenere a volte dati veramente dettagliati per la risoluzione dei problemi, ecc. E di solito è impossibile per i team operativi, se ne hanno bisogno per cambiare il modo in cui funziona la registrazione, per convincere lo sviluppatore a fare grandi cambiamenti al codice. Questo spesso porta a tempi di fermo della produzione, attriti tra le operazioni e lo sviluppo, e tempo sprecato tutto intorno.

Dal punto di vista dello sviluppatore, Log4j ti isola dal dover apportare modifiche al codice per supportare la registrazione e ti impedisce di essere infastidito da persone che desiderano modifiche di registrazione. Permette alle persone che gestiscono il tuo codice di grattarsi il proprio prurito invece di disturbarti!

Inoltre, dal momento che Log4j è lo standard di fatto per la registrazione Java, ci sono molti strumenti disponibili che possono fare cose interessanti con Log4j, oltre a impedire a te e ai tuoi team operativi di reinventare la ruota.

La mia caratteristica preferita è la possibilità di scrivere facilmente appenders inviano i dati a fonti non di file, come SYSLOG, Splunk, ecc, che lo rende facile personalizzato di registrazione della tua applicazione in strumenti di gestione delle operazioni del reparto IT è già utilizzando.

+0

Log4j era uno standard defacto, ma con java.util.logging, Commons Logging e molti altri framework di registrazione che supporta, non sono sicuro che ciò sia ancora vero. Molti progetti open source che ho visto ultimamente non usano più log4j. – justkt

+0

Log4j potrebbe non essere più il tesoro della registrazione Java, ma è ancora molto superiore a System.out/.error. Anche la registrazione di Commons è stata sostituita e la registrazione JDK è sempre stata un caso di sindrome "non inventata qui". – SteveD

+0

È un duplicato o è possibile che questa domanda di base non sia stata ancora richiesta? Sono sospettoso ma voglio essere sorpreso. La mia ricerca rapida non ha trovato un duplicato ovvio, ma non è stata neppure una ricerca esauriente. –

1

miei preferiti (non tutti)

  • Possibilità di impostare i parametri di registrazione in config, senza ricompilare
  • Possibilità di impostare il registro modo in cui viene scritto (da file di testo al mittente SMTP)
  • Capacità filtrare per gravità
1

Livelli, formattazione, registrazione su più file ... Un framework di registrazione (anche se è java.util.logging) è davvero vantaggioso se c'è una possibilità che qualcosa possa andare storto il tuo codice è in esecuzione.

1

Log4j offre la possibilità di ruotare i file di registro in base alle dimensioni ed eliminarli in base alla quantità (logrotate), in modo che i server non riempiano i loro dischi. Personalmente penso che sia una delle funzionalità più preziose di Log4j.

Anche Log4j è popolare e compreso da molti sviluppatori. Le ultime tre società a cui ho lavorato hanno utilizzato Log4j nella maggior parte dei progetti.

1

log4j consente di accedere a varie risorse, ad es. registro degli eventi, e-mail, file system ecc. consentendo al tempo stesso che l'applicazione rimanga disaccoppiata da tutte queste risorse. Inoltre, puoi utilizzare un'interfaccia comune per accedere a tutte le varie risorse senza dover imparare o integrare le loro API corrispondenti.

7

In realtà, si dovrebbe esaminare la facciata slf4j in questi giorni, in quanto consente di utilizzare {} -placeholders per le dichiarazioni più concise.È quindi possibile utilizzare il framework di registrazione appropriato dietro slf4j per gestire il trattamento effettivo delle istruzioni del registro. Questo potrebbe essere log4j o lo slf4j-simple che stampa tutte le informazioni INFO, WARN e ERROR e scarta il resto.

L'osservazione cruciale che devi fare è che la SCRITTURA delle istruzioni di registro viene eseguita quando il codice è scritto e la DECISIONE di ciò che è necessario viene eseguita quando il codice viene distribuito, che può essere anni dopo che il codice è stato scritto e testato. System.out.println richiede di modificare fisicamente il codice per sbarazzarsi di essi, il che è inaccettabile in un rigido ciclo di implementazione di test di scrittura. SE il codice cambia, deve essere ritestato. Con slf4j abiliti solo quelli che vuoi vedere.

Abbiamo la registrazione completa nella fase di test, e piuttosto la registrazione dettagliata nel periodo iniziale di una distribuzione di produzione, dopodiché scendiamo solo alle informazioni. Questo ci dà informazioni complete in uno scenario in cui il debug di un caso è molto raramente possibile.

Potresti trovare questo articolo che ho scritto interessante. Il pubblico di destinazione sta iniziando i programmatori Java, con l'intenzione di dare loro buone abitudini fin dall'inizio. http://runjva.appspot.com/logging101/index.html

1

Date un'occhiata e capirete il potere di log4j:

log4j.properties ho usato una volta per un progetto:

# ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF 

# No appenders for rootLogger 
log4j.rootLogger=OFF 

folder=.. 
prefix= 
fileExtension=.log 
htmlExtension=${fileExtension}.html 
datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz 
layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n 

# myLogger logger 
log4j.logger.myLogger=ALL, stdout, infoFile, infoHtml, errorFile 

# stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=${layout} 
# infoFile 
log4j.appender.infoFile=org.apache.log4j.FileAppender 
log4j.appender.infoFile.File=${folder}/${prefix}_info${fileExtension} 
log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.infoFile.layout.ConversionPattern=${layout} 
# infoHtml 
log4j.appender.infoHtml=org.apache.log4j.FileAppender 
log4j.appender.infoHtml.File=${folder}/${prefix}_info${htmlExtension} 
log4j.appender.infoHtml.layout=org.apache.log4j.HTMLLayout 
log4j.appender.infoHtml.layout.Title=Logs 
log4j.appender.infoHtml.layout.LocationInfo=true 
# errorFile 
log4j.appender.errorFile=org.apache.log4j.FileAppender 
log4j.appender.errorFile.File=${folder}/${prefix}_error${fileExtension} 
log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.errorFile.layout.ConversionPattern=${layout} 

# APPENDERS SETTINGS 
log4j.appender.stdout.Threshold = ALL 
log4j.appender.infoFile.Threshold = INFO 
log4j.appender.infoHtml.Threshold = INFO 
log4j.appender.errorFile.Threshold = WARN. 

Per modificare le variabili nel codice Java è possibile fare:

Caricamento Configurazione

Log4j caricherà automaticamente la configurazione se è memorizzata in un file chiamato "log4j.properties" ed è presente sul classpath sotto "" (ad es. WEB-INF/classes/log4j.properties).

non mi piace questo approccio e preferisco caricare la configurazione esplicitamente chiamando:

PropertyConfigurator.configure (Config.ETC + "/log4j.properties"); In questo modo posso ricaricare la configurazione in qualsiasi momento purché l'applicazione sia ancora in esecuzione. Mi piace aggiungere un pulsante a un jsp amministrativo , "Ricarica Log4J".

dinamico file di registro di localizzazione

Molte persone si lamentano che Log4j ti costringe a hard-code il percorso dove verranno conservati i log di. In realtà, è possibile dinamicamente scegliere il percorso del file di registro, soprattutto se si utilizza la tecnica di sostituzione delle proprietà $ {log.dir} sopra.Ecco come:

String dynamicLog = // log directory somehow chosen... 
Properties p = new Properties(Config.ETC + "/log4j.properties"); 
p.put("log.dir", dynamicLog); // overwrite "log.dir" 
PropertyConfigurator.configure(p); 
0
  • la registrazione (Documento eventi di business storici che si verificano, è possibile controllare i vecchi registri)
  • monitorare l'applicazione (flusso di progetto)
  • il debug dell'applicazione (Informazioni dettagliate ciò che avviene in un metodo a livello granulare // dati, valore e tutti i metodi interni)
  • gestione errori (informazioni su errore specifico che si verificano)