Spero che Log4j non abbia bisogno di presentazioni e presumo che tu abbia già una comprensione di base di Log4j. In caso contrario, ti raccomando di leggere prima questo tutorial di Log4j, per iniziare.
Detto questo, ora inizierò con MDC o Mapped Diagnostic Context. Non spaventatevi con questo nome! MDC non è così difficile. È un concetto semplice ma utile. Prima di spiegare cos’è MDC, supponiamo di sviluppare una semplice applicazione web con una servlet MyServlet
che serve richieste da più client. Questa servlet usa il framework log4j per il logging. Un file appender è stato definito per questa servlet, così tutti i messaggi di log saranno registrati in un file di testo.
Con la configurazione di cui sopra, tutti i messaggi di log da MyServlet
andranno in un singolo file di log. E quando questa servlet serve più di un client allo stesso tempo, i messaggi di log saranno mischiati e non c’è modo di distinguere quale messaggio di log appartiene a quale client sta elaborando. Questo renderà difficile tracciare ed eseguire il debug se si verifica un errore di elaborazione nel MyServlet
ciclo di vita.
Come differenziare le dichiarazioni di log relative a ciascun client?
Per evitare il mix-in delle dichiarazioni di log, potremmo aggiungere un nome utente (o qualche altro dato che sarà unico per ciascun client) alle nostre dichiarazioni di log. Per fare questo, dobbiamo assicurarci di passare esplicitamente questi dati del nome utente ad ogni dichiarazione di log, il che è un lavoro noioso e ripetitivo. Ma non c’è bisogno di preoccuparsi! Log4j ha un modo eccellente per superare questo. Si chiama MDC o Mapped Diagnostic Context.
Cos’è Log4j MDC (Mapped Diagnostic Context)
Per farla semplice, l’MDC è una mappa che memorizza i dati del contesto del particolare thread in cui il contesto è in esecuzione. Per spiegarlo, torniamo alla nostra semplice applicazione – ogni richiesta del cliente sarà servita da diversi thread del MyServlet
. Quindi, se usate log4j per la registrazione, allora ogni thread può avere il proprio MDC che è globale per l’intero thread. Qualsiasi codice che fa parte di quel thread può facilmente accedere ai valori che sono presenti nel MDC del thread.
Quindi, come facciamo a fare MDC per differenziare le dichiarazioni di registrazione da più clienti? Semplice: prima di iniziare qualsiasi processo aziendale nel vostro codice, ottenete il nome utente (per il nostro Servlet, possiamo ottenerlo dall’oggetto request
) e mettetelo in MDC. Ora il nome utente sarà disponibile per l’ulteriore elaborazione. Nel tuo log4j.properties mentre definisci il conversionPattern
, aggiungi un pattern %X{key}
per recuperare i valori che sono presenti nell’MDC. La chiave sarà userName nel nostro esempio. È come ottenere un valore da un oggetto Session.