Vai avanti: programma sull'API log4j2 invece di slf4j
È sicuro: l'API Log4j2 offre le stesse identiche garanzie di slf4j e altro ancora.
Ora che Log4j2 stesso è separato in un'API e un modulo di implementazione, non c'è più alcun valore nell'usare SLF4J.
Sì, è una buona pratica ingegneristica mantenere aperte le opzioni. Potrebbe essere necessario passare a un'altra implementazione di registrazione in un secondo momento.
Negli ultimi 10 anni circa, creare una tale flessibilità nell'applicazione ha significato utilizzare un'API wrapper come SLF4J. Tuttavia, questa flessibilità non è gratuita: lo svantaggio di questo approccio è che l'applicazione non può utilizzare il set di funzionalità più ricco della libreria di registrazione sottostante.
Log4j2 offre una soluzione che non richiede che la tua applicazione sia limitata al minimo comune denominatore.
La valvola di sfogo: log4j-to-slf4j
Log4j2 include un log4j-to-slf4j
modulo bridge. Qualsiasi applicazione codificata con l'API Log4j2 può scegliere di cambiare l'implementazione di supporto a qualsiasi implementazione conforme a slf4j in qualsiasi momento.
Come accennato nella domanda, l'utilizzo dell'API Log4j2 offre direttamente più funzionalità e presenta alcuni vantaggi non funzionali rispetto all'utilizzo di un'API wrapper come slf4j:
- Message API
- Lambda per la registrazione lenta
- Registra qualsiasi oggetto anziché solo stringhe
- Garbage-free: evita di creare vararg o stringhe dove possibile
- CloseableThreadContext rimuove automaticamente gli elementi da MDC quando hai finito con loro
(Vedi 10 Funzionalità API Log4j2 non disponibili in SLF4J per maggiori dettagli.)
Le applicazioni possono utilizzare in sicurezza queste ricche funzionalità dell'API Log4j2 senza essere vincolate all'implementazione core nativa di Log4j2.
SLF4J è ancora la tua valvola di sicurezza, semplicemente non significa che la tua applicazione dovrebbe più codificare contro l'API SLF4J.
Divulgazione: contribuisco a Log4j2.
Aggiornamento: sembra esserci una certa confusione sul fatto che la programmazione con l'API Log4j2 in qualche modo introduce una "facciata per una facciata". Non c'è differenza a questo riguardo tra l'API Log4j2 e SLF4J.
Entrambe le API richiedono 2 dipendenze quando si utilizza un'implementazione nativa e 4 dipendenze per un'implementazione non nativa. SLF4J e l'API Log4j2 sono identiche sotto questo aspetto. Per esempio:
slf4j
e effettua il logback (o log4jv1)? Dovrei quindi essere costretto a installare un terzo logger per utilizzare la tua applicazione? O forse la sicurezza aziendale decide che puoi usarlo solojava.util.logging
in produzione, e allora?