log4j è un framework di registrazione (API) affidabile, veloce e flessibile scritto in Java, distribuito sotto la licenza software Apache.

log4j è stato portato nei linguaggi C, C ++, C #, Perl, Python, Ruby e Eiffel.

log4j è altamente configurabile tramite file di configurazione esterni in fase di esecuzione. Visualizza il processo di registrazione in termini di livelli di priorità e offre meccanismi per indirizzare le informazioni di registrazione a una grande varietà di destinazioni, come un database, un file, una console, UNIX Syslog, ecc.

log4j ha tre componenti principali:

  • logger: responsabile dell'acquisizione delle informazioni di registrazione.

  • appenders: responsabile della pubblicazione delle informazioni di registrazione in varie destinazioni preferite.

  • layout: responsabile della formattazione delle informazioni di registrazione in diversi stili.

Di seguito sono riportate le funzionalità di log4j:

  • È thread-safe.

  • È ottimizzato per la velocità.

  • Si basa su una gerarchia di logger denominata.

  • Supporta più appendici di output per logger.

  • Supporta l'internazionalizzazione.

  • Non è limitato a un insieme predefinito di servizi.

  • Il comportamento di registrazione può essere impostato in fase di esecuzione utilizzando un file di configurazione.

  • È progettato per gestire le eccezioni Java dall'inizio.

  • Usa più livelli, vale a dire ALL, TRACE, DEBUG, INFO, WARN, ERROR e FATAL.

  • Il formato dell'output del registro può essere facilmente modificato estendendo la classe Layout.

  • Il target dell'output del log e la strategia di scrittura possono essere modificati dalle implementazioni dell'interfaccia di Appender.

  • È fail-stop. Tuttavia, sebbene si sforzi di garantire la consegna, log4j non garantisce che ogni istruzione di registro verrà consegnata alla sua destinazione.

Di seguito sono riportati i pro ei contro della registrazione:

La registrazione è una componente importante dello sviluppo del software. Un codice di registrazione ben scritto offre un debug rapido, una facile manutenzione e un'archiviazione strutturata delle informazioni di runtime di un'applicazione.

La registrazione ha anche i suoi svantaggi. Può rallentare un'applicazione. Se troppo prolisso, può causare cecità da scorrimento. Per alleviare queste preoccupazioni, log4j è progettato per essere affidabile, veloce ed estensibile.

Poiché la registrazione è raramente l'obiettivo principale di un'applicazione, l'API log4j si sforza di essere semplice da capire e da usare.

Oggetto Logger: il livello superiore dell'architettura log4j è il Logger che fornisce l'oggetto Logger. L'oggetto Logger è responsabile dell'acquisizione delle informazioni di registrazione e vengono archiviate in una gerarchia dello spazio dei nomi.

Oggetto layout - Il livello di layout dell'architettura log4j fornisce oggetti che vengono utilizzati per formattare le informazioni di registrazione in stili diversi. Fornisce supporto agli oggetti appender prima di pubblicare le informazioni di registrazione.

Gli oggetti del layout svolgono un ruolo importante nella pubblicazione delle informazioni di registrazione in modo leggibile e riutilizzabile.

Oggetto Appender - Questo è un livello inferiore dell'architettura log4j che fornisce oggetti Appender. L'oggetto Appender è responsabile della pubblicazione delle informazioni di registrazione su varie destinazioni preferite come database, file, console, UNIX Syslog, ecc.

Oggetto Livello: l'oggetto Livello definisce la granularità e la priorità di qualsiasi informazione di registrazione. Esistono sette livelli di registrazione definiti all'interno dell'API: OFF, DEBUG, INFO, ERROR, WARN, FATAL e ALL.

Oggetto filtro: l'oggetto Filtro viene utilizzato per analizzare le informazioni di registrazione e prendere ulteriori decisioni sull'opportunità di registrare o meno tali informazioni. A un oggetto Appender possono essere associati diversi oggetti Filtro. Se le informazioni di registrazione vengono passate a un particolare oggetto Appender, tutti gli oggetti Filtro associati a tale Appender devono approvare le informazioni di registrazione prima che possano essere pubblicate nella destinazione allegata.

ObjectRenderer: l'oggetto ObjectRenderer è specializzato nel fornire una rappresentazione String di diversi oggetti passati al framework di registrazione. Questo oggetto viene utilizzato dagli oggetti Layout per preparare le informazioni di registrazione finali.

LogManager: l'oggetto LogManager gestisce il framework di registrazione. È responsabile della lettura dei parametri di configurazione iniziale da un file di configurazione a livello di sistema o da una classe di configurazione.

Il file log4j.properties è un file di configurazione log4j che mantiene le proprietà in coppie chiave-valore. Per impostazione predefinita, LogManager cerca un file denominato log4j.properties in CLASSPATH.

layout - Appender utilizza gli oggetti Layout e il modello di conversione ad essi associato per formattare le informazioni di registrazione.

target: il target può essere una console, un file o un altro elemento a seconda dell'appender.

livello: il livello è necessario per controllare il filtraggio dei messaggi di registro.

soglia: all'appender può essere associato un livello di soglia indipendentemente dal livello di logger. L'Appender ignora tutti i messaggi di registrazione che hanno un livello inferiore al livello di soglia.

filter - Gli oggetti Filter possono analizzare le informazioni di registrazione oltre la corrispondenza dei livelli e decidere se le richieste di registrazione devono essere gestite da un particolare Appender o ignorate.

La seguente sintassi definisce il logger root con il file appender:

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE

La seguente sintassi definisce un appender di file -

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

La seguente sintassi definisce il layout dell'appender file:

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Qualsiasi altra istanza di oggetto Logger denominata viene ottenuta tramite il secondo metodo passando il nome del logger. Il nome del logger può essere qualsiasi stringa che puoi passare, di solito il nome di una classe o di un pacchetto come abbiamo usato nell'ultimo capitolo ed è menzionato di seguito -

static Logger log = Logger.getLogger(log4jExample.class.getName());

public void debug (Object message) della classe Logger stampa i messaggi con il livello Level.DEBUG.

public void error (Object message) della classe Logger stampa i messaggi con il livello Level.ERROR.

public void fatal (Object message) della classe Logger stampa i messaggi con il livello Level.FATAL.

public void info (Object message) della classe Logger stampa i messaggi con il livello Level.INFO.

public void warn (Object message) della classe Logger stampa i messaggi con il livello Level.WARN.

public void trace (Object message) della classe Logger stampa i messaggi con il livello Level.TRACE.

TUTTI - Tutti i livelli, compresi i livelli personalizzati.

DEBUG: designa eventi informativi a grana fine più utili per eseguire il debug di un'applicazione.

ERRORE: indica eventi di errore che potrebbero ancora consentire all'applicazione di continuare l'esecuzione.

FATALE - Indica eventi di errore molto gravi che presumibilmente porteranno l'applicazione a interrompersi.

INFO - Indica messaggi informativi che evidenziano l'avanzamento dell'applicazione a livello di grana grossa.

OFF: il grado più alto possibile ed è destinato a disattivare la registrazione.

TRACE: designa eventi informativi a grana più fine rispetto a DEBUG.

AVVISO - Indica situazioni potenzialmente dannose.

Una richiesta di log di livello p in un logger con livello q è abilitata se p> = q. Questa regola è al centro di log4j. Si presuppone che i livelli siano ordinati. Per i livelli standard, abbiamo ALL <DEBUG <INFO <WARN <ERROR <FATAL <OFF.

La seguente sintassi definisce il logger root con la modalità WARN che disattiva la modalità DEBUG.

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE

Se si desidera generare le informazioni di registrazione in un formato particolare basato su un modello, è possibile utilizzare org.apache.log4j.PatternLayout per formattare le informazioni di registrazione.

La classe PatternLayout estende la classe astratta org.apache.log4j.Layout e sovrascrive il metodo format () per strutturare le informazioni di registrazione secondo un modello fornito.

c - Utilizzato per generare la categoria dell'evento di registrazione. Ad esempio, per il nome della categoria "abc" il pattern% c {2} restituirà "bc".

C - Utilizzato per emettere il nome completo della classe del chiamante che emette la richiesta di registrazione. Ad esempio, per il nome della classe. "org.apache.xyz.SomeClass", il pattern% C {1} produrrà "SomeClass".

d - Utilizzato per produrre la data dell'evento di registrazione. Ad esempio,% d {HH: mm: ss, SSS} o% d {dd MMM yyyy HH: mm: ss, SSS}.

F: utilizzato per generare il nome del file in cui è stata emessa la richiesta di registrazione.

l - Utilizzato per visualizzare le informazioni sulla posizione del chiamante che ha generato l'evento di registrazione.

L: utilizzato per produrre il numero di riga da cui è stata emessa la richiesta di registrazione.

m - Utilizzato per emettere il messaggio fornito dall'applicazione associato all'evento di registrazione.

M: utilizzato per produrre il nome del metodo in cui è stata emessa la richiesta di registrazione.

n - Emette il carattere oi caratteri separatori di riga dipendenti dalla piattaforma.

p - Usato per emettere la priorità dell'evento di registrazione.

r - Usato per visualizzare il numero di millisecondi trascorsi dalla costruzione del layout fino alla creazione dell'evento di registrazione.

t - Utilizzato per produrre il nome del thread che ha generato l'evento di registrazione.

x: utilizzato per generare l'NDC (contesto diagnostico annidato) associato al thread che ha generato l'evento di registrazione.

X: il carattere di conversione X è seguito dalla chiave per MDC. Ad esempio, X {clientIP} stamperà le informazioni memorizzate nell'MDC contro la chiave clientIP.

%: Il segno di percentuale letterale. %% stamperà un segno%.

Per impostazione predefinita, le informazioni rilevanti vengono visualizzate come output così come sono. Tuttavia, con l'aiuto dei modificatori di formato, è possibile modificare la larghezza minima del campo, la larghezza massima del campo e la giustificazione.

% 20c - Pad sinistro con spazi se il nome della categoria è lungo meno di 20 caratteri.

% -20c - Pad destro con spazi se il nome della categoria è lungo meno di 20 caratteri.

% .30c - Troncamento dall'inizio se il nome della categoria è più lungo di 30 caratteri.

% 20.30c - Pad sinistro con spazi se il nome della categoria è inferiore a 20 caratteri. Tuttavia, se il nome della categoria è più lungo di 30 caratteri, troncare dall'inizio.

% -20.30c - Pad destro con spazi se il nome della categoria è inferiore a 20 caratteri. Tuttavia, se il nome della categoria è più lungo di 30 caratteri, troncare dall'inizio.

Se si desidera generare le informazioni di registrazione in un file in formato HTML, è possibile utilizzare org.apache.log4j.HTMLLayout per formattare le informazioni di registrazione.

La classe HTMLLayout estende la classe astratta org.apache.log4j.Layout e sostituisce il metodo format () dalla sua classe base per fornire una formattazione in stile HTML.

Fornisce le seguenti informazioni da visualizzare:

  • Il tempo trascorso dall'inizio dell'applicazione prima che venisse generato un particolare evento di registrazione.

  • Il nome del thread che ha richiamato la richiesta di registrazione.

  • Il livello associato a questa richiesta di registrazione.

  • Il nome del logger e il messaggio di registrazione.

  • Le informazioni sulla posizione facoltativa per il file di programma e il numero di riga da cui è stata richiamata questa registrazione.

HTMLLayout.setContentType (String) - Imposta il tipo di contenuto del contenuto HTML. L'impostazione predefinita è text / html.

HTMLLayout.setLocationInfo (String) - Imposta le informazioni sulla posizione per l'evento di registrazione. L'impostazione predefinita è false.

HTMLLayout.setTitle (String) - Imposta il titolo per il file HTML. L'impostazione predefinita è log4j Log Messages.

immediateFlush: per impostazione predefinita, questo flag è impostato su true, il che significa che il flusso di output del file viene scaricato con ogni operazione di aggiunta.

codifica - È possibile utilizzare qualsiasi codifica dei caratteri. Per impostazione predefinita, è lo schema di codifica specifico della piattaforma.

soglia: il livello di soglia per questo appender.

Nome file: il nome del file di registro.

fileAppend: per impostazione predefinita è impostato su true, il che significa che le informazioni di registrazione vengono aggiunte alla fine dello stesso file.

bufferedIO: questo flag indica se è necessario abilitare la scrittura bufferizzata. Per impostazione predefinita, è impostato su false.

bufferSize - Se è abilitato l'I / O bufferizzato, indica la dimensione del buffer. Per impostazione predefinita, è impostato su 8kb.

Il codice seguente configura lo svuotamento immediato su true -

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

Il codice seguente imposta la soglia per la modalità di debug -

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

Il codice seguente imposta l'append su false, sovrascrivi -

# Set the append to false, overwrite
log4j.appender.FILE.Append=false

Per scrivere le informazioni di registrazione in più file, è necessario utilizzare la classe org.apache.log4j.RollingFileAppender che estende la classe FileAppender ed eredita tutte le sue proprietà.

Questa è la dimensione critica del file al di sopra della quale verrà eseguito il rollio.

Il valore predefinito è 10 MB.

Questa proprietà denota il numero di file di backup da creare.

Il valore predefinito è 1.

Il codice seguente configura un RollingFileAppender -

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

Il codice seguente configura la dimensione massima del file prima del rollover -

# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5KB

Il codice seguente configura il numero massimo di file da utilizzare -

# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2

Verrà creato un nuovo file di registro.

Quando l'ultimo file di registro raggiunge la dimensione massima, il primo file di registro verrà cancellato e, successivamente, tutte le informazioni di registrazione verranno riportate al primo file di registro.

Per scrivere le tue informazioni di registrazione nei file su base giornaliera, dovresti usare la classe org.apache.log4j.DailyRollingFileAppender che estende la classe FileAppender ed eredita tutte le sue proprietà.

Indica quando eseguire il rollover del file e la convenzione di denominazione da seguire. Per impostazione predefinita, il rollover viene eseguito a mezzanotte ogni giorno.

"." yyyy-MM: rollover alla fine di ogni mese e all'inizio del mese successivo.

"." yyyy-MM-dd - Rollover a mezzanotte ogni giorno. Questo è il valore predefinito.

"." aaaa-MM-gg-a: passa a mezzogiorno e mezzanotte di ogni giorno.

"." aaaa-MM-gg-HH: passa il mouse all'inizio di ogni ora.

"." aaaa-MM-gg-HH-mm - Ritorna ogni minuto.

"." yyyy-ww: passa il primo giorno di ogni settimana a seconda della località.

Il codice seguente configura un DailyRollingFileAppender -

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE 
# Define the file appender
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender

Il codice seguente configura un DatePattern -

# Set the DatePattern
log4j.appender.FILE.DatePattern = '.' yyyy-MM-dd-a

L'API log4j fornisce l'oggetto org.apache.log4j.jdbc.JDBCAppender, che può inserire le informazioni di registrazione in un database specificato.

driver - Imposta la classe del driver sulla stringa specificata. Se non è specificata alcuna classe driver, il valore predefinito è sun.jdbc.odbc.JdbcOdbcDriver.

password - Imposta la password del database.

sql: specifica l'istruzione SQL da eseguire ogni volta che si verifica un evento di registrazione. Potrebbe essere INSERT, UPDATE o DELETE.

URL: imposta l'URL JDBC.

user - Imposta il nome utente del database.