Guida alla registrazione Java: nozioni di base
Arfan Sharif – 13 febbraio 2023
La registrazione ti aiuta a capire come funziona un'applicazione o cosa è andato storto quando qualcosa non funziona. Queste informazioni possono essere fondamentali per scopi di debug e controllo. I registri mantengono una traccia di ogni evento durante l'esecuzione di un programma, rendendo tali record disponibili per un'analisi successiva.
Tuttavia, la registrazione effettiva non avviene automaticamente. Gli sviluppatori di applicazioni devono garantire che un'applicazione registri sistematicamente dettagli importanti in un formato facile da elaborare.
L'approccio più rudimentale alla registrazione è il semplice utilizzo delle istruzioni print per visualizzare i dettagli dell'applicazione desiderata. Naturalmente, questo non è un approccio ideale per i seguenti motivi:
Per tutti questi motivi, molti linguaggi di programmazione, come Java, includono API e framework di registrazione dedicati. In questa panoramica, la prima parte della serie, introdurremo i concetti di registrazione di base per le applicazioni Java. Esamineremo le opzioni di registrazione e poi prenderemo in considerazione diversi framework di registrazione disponibili e le relative configurazioni supportate.
Esplora la serie completa della guida alla registrazione Java:
Come ogni altra cosa nella sua architettura, Java adotta un approccio estensibile e personalizzabile alla registrazione. Il framework java.util.logging è l'opzione predefinita per tutte le funzioni relative alla registrazione. Questo framework fornisce tutte le funzionalità di base necessarie per la registrazione consentendo al contempo ai framework di terze parti di estendere tali funzionalità.
Questo framework di registrazione include tre moduli principali:
Un altro concetto degno di nota qui è il filtro. I filtri consentono allo sviluppatore di intercettare un LogRecord e decidere quale gestore utilizzare. Sebbene non necessari per la registrazione di base, i filtri possono aiutare a soddisfare requisiti di registrazione complessi.
Per il framework di registrazione di Java, la posizione di output predefinita è la directory home dell'utente.
Mentre il framework di registrazione di Java fornisce tutte le funzionalità di base, i framework di terze parti possono fare parecchio combinando logger, gestori e formattatori. Log4j 2 e Logback sono due framework di logging popolari, ciascuno con i propri punti di forza.
Poiché per Java sono disponibili più framework e i relativi set di funzionalità sono in continua evoluzione, gli sviluppatori spesso desiderano provare qualcosa di diverso. È qui che entrano in gioco gli estrattori di registrazione. Gli abstractor consentono agli sviluppatori di passare rapidamente da un framework di registrazione all'altro utilizzando una specifica di funzione standard. Simple Logging Facade for Java (SLF4J) è un popolare logging abstractor che supporta il framework predefinito, Log4j 2 e Logback. Apache commons-logging è un altro tale astrattor.
È importante notare, tuttavia, che le versioni senza patch di Log4j 2 rappresentano un rischio critico per la sicurezza (CVE-2021-44228). Anche se meno gravi, esistono notevoli rischi per la sicurezza anche per Log4j 1.x (CVE-2021-4104) e Logback (CVE-2021-42550). Poiché l'uso degli abstractor dipende ancora da questi framework sottostanti, è fondamentale che queste librerie vulnerabili siano adeguatamente aggiornate e patchate per un utilizzo sicuro.
Il framework predefinito utilizza un file di configurazione per definire i dettagli di appender, logger e layout. Per impostazione predefinita, questo file è presente nella cartella lib della directory di installazione di Java, ma si tratta di un file di configurazione globale.
È buona norma definire un file di configurazione specifico dell'applicazione. Puoi farlo specificando il nome del file delle proprietà all'avvio dell'applicazione, come mostrato di seguito:
Un semplice file di configurazione sarà simile al seguente:
Qui, la configurazione registrerà gli eventi dell'applicazione in un file che creerà nella directory home dell'utente. Il valore %h denota la directory home e %u denota un numero univoco arbitrario che Java imposterà per distinguere tra i file di registro.
Ora, per creare un nuovo file di registro da una nuova classe, puoi utilizzare lo snippet di codice seguente:
Quando e cosa registrare dipende interamente dallo sviluppatore dell'applicazione e dipende dalla strategia di registrazione adottata dal team dell'applicazione. Una volta che lo sviluppatore ha deciso quali eventi registrare, la registrazione richiede semplicemente una singola riga di codice. Ecco un esempio: