Introduzione a SLF4J

1. Panoramica

Simple Logging Facade per Java (abbreviato SLF4J) - funge da facciata per diversi framework di registrazione (ad esempio java.util.logging, logback, Log4j). Offre un'API generica che rende la registrazione indipendente dall'attuale implementazione.

Ciò consente la coesistenza di diversi framework di registrazione. Aiuta anche a migrare da un framework a un altro. Infine, oltre all'API standardizzata, offre anche un po 'di "zucchero sintattico".

Questo articolo discuterà le dipendenze e la configurazione necessarie per integrare SLF4J con Log4j2, Logback, Log4J2 e Jakarta Commons Logging. Ulteriori informazioni su ciascuna di queste implementazioni sono disponibili nell'articolo Introduzione a Java Logging.

2. La configurazione di Log4j2

Per utilizzare SLF4J con Log4j2 dovresti aggiungere le seguenti librerie a pom.xml :

 org.apache.logging.log4j log4j-api 2.7   org.apache.logging.log4j log4j-core 2.7   org.apache.logging.log4j log4j-slf4j-impl 2.7 

L'ultima versione può essere trovata qui: log4j-api, log4j-core, log4j-slf4j-impl.

La configurazione di registrazione effettiva aderisce alla configurazione Log4j 2 nativa. Vediamo come viene creata l' istanza Logger :

public class SLF4JExample { private static Logger logger = LoggerFactory.getLogger(SLF4JExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

Notare che Logger e LoggerFactory appartengono al pacchetto org.slf4j . Un esempio di progetto, in esecuzione con la configurazione spiegata, è disponibile qui.

3. La configurazione del logback

Per utilizzare SLF4J con Logback non è necessario aggiungere SLF4J al proprio classpath. Logback sta già utilizzando SLF4J. È considerata l'implementazione di riferimento. Dobbiamo solo includere la libreria Logback:

 ch.qos.logback logback-classic 1.1.7 

L'ultima versione può essere trovata qui: logback-classic.

La configurazione è specifica per Logback ma funziona perfettamente con SLF4J. Con le dipendenze e la configurazione appropriate, è possibile utilizzare lo stesso codice delle sezioni precedenti per gestire la registrazione.

4 . L'installazione di Log4j

Nelle sezioni precedenti, abbiamo coperto un caso d'uso in cui SLF4J "si trova" in cima alla particolare implementazione del logging. Usato in questo modo, astrae completamente la struttura sottostante.

Ci sono casi in cui una soluzione di registrazione esistente non può essere sostituita, ad esempio a causa di requisiti di terze parti. Ciò, tuttavia, non significa che il progetto sia “condannato” solo al framework già utilizzato.

SLF4J può essere configurato come bridge, in cui vengono reindirizzate le chiamate a un framework esistente. Aggiungiamo le dipendenze necessarie per creare un bridge per Log4j:

 org.slf4j log4j-over-slf4j 1.7.30 

Con la dipendenza in atto (controlla le ultime su log4j-over-slf4j), tutte le chiamate a Log4j verranno reindirizzate a SLF4J. Considera la documentazione ufficiale per saperne di più sul bridging dei framework esistenti.

Proprio come con gli altri framework, Log4j può fungere da implementazione sottostante. Aggiungiamo le dipendenze necessarie:

 org.slf4j slf4j-log4j12 1.7.30   log4j log4j 1.2.17 

L'ultima versione può essere trovata qui per slf4j-log4j12 e log4j. Un progetto esemplare, configurato nel modo spiegato è disponibile qui.

5. Configurazione di JCL Bridge

Nelle sezioni precedenti, abbiamo mostrato come utilizzare la stessa base di codice per supportare la registrazione utilizzando implementazioni diverse. Sebbene questa sia la principale promessa e forza di SLF4J, è anche l'obiettivo dietro JCL (Jakarta Commons Logging o Apache Commons Logging).

JCL è, secondo le sue intenzioni, un framework simile a SLF4J. La differenza principale è che JCL risolve l'implementazione sottostante durante il tempo di esecuzione tramite un sistema di caricamento delle classi. Questo approccio è percepito come problematico nei casi in cui sono in gioco classloader personalizzati.

SLF4J risolve i suoi collegamenti in fase di compilazione. È percepito più semplice ma abbastanza potente.

Fortunatamente, due framework possono lavorare insieme in modalità bridge:

 org.slf4j jcl-over-slf4j 1.7.30 

L'ultima versione della dipendenza può essere trovata qui jcl-over-slf4j.

Come con gli altri casi, lo stesso codice base funzionerà perfettamente. Un esempio di un progetto completo che esegue questa configurazione è disponibile qui.

6. Ulteriore bontà SLF4J

SLF4J fornisce ulteriori che possono rendere la registrazione più efficiente e il codice più leggibile. Ad esempio, SLF4J fornisce un'interfaccia molto utile per lavorare con i parametri:

String variable = "Hello John"; logger.debug("Printing variable value: {}", variable);

Ecco il codice di esempio di Log4j che fa la stessa cosa:

String variable = "Hello John"; logger.debug("Printing variable value: " + variable);

Come puoi vedere, Log4j concatenerà le stringhe indipendentemente dal livello di debug abilitato o meno. Nelle applicazioni ad alto carico, ciò potrebbe causare problemi di prestazioni. SLF4J concatenerà le stringhe solo quando il livello di debug è abilitato. Per fare lo stesso con Log4J è necessario aggiungere un blocco if extra che controllerà se il livello di debug è abilitato o meno:

String variable = "Hello John"; if (logger.isDebugEnabled()) { logger.debug("Printing variable value: " + variable); }

SLF4J ha standardizzato i livelli di registrazione che sono diversi per le implementazioni particolari. Il livello di registrazione FATAL è stato abbandonato (è stato introdotto in Log4j) sulla base della premessa che in un framework di registrazione, non dovremmo decidere quando terminare un'applicazione.

I livelli di registrazione utilizzati sono ERROR, WARN, INFO, DEBUG, TRACE . Puoi leggere ulteriori informazioni sul loro utilizzo nell'articolo Introduzione alla registrazione Java.

7. Conclusione

SLF4J aiuta con il passaggio silenzioso tra i framework di registrazione. È semplice, ma flessibile e consente di migliorare la leggibilità e le prestazioni.

Come al solito, il codice può essere trovato su GitHub. Inoltre, stiamo facendo riferimento ad altri due progetti dedicati a diversi articoli, ma contenenti configurazioni di log discusse, qui e qui.