Vale la pena usare slf4j con log4j2


114

Non sono in grado di decidere se utilizzare slf4j o meno con log4j2. Sulla base dei post online, non sembra che avrà alcun calo di prestazioni ma è davvero necessario.

Anche questi punti regolano a favore di log4j2:

  • SLF4J forza la tua applicazione a registrare le stringhe. L'API Log4j 2 supporta la registrazione di qualsiasi CharSequence se si desidera registrare il testo, ma supporta anche la registrazione di qualsiasi oggetto così com'è.
  • L'API Log4j 2 offre supporto per la registrazione di oggetti Message, espressioni lambda Java 8 e registrazione priva di dati inutili (evita di creare array vararg ed evita di creare stringhe durante la registrazione di oggetti CharSequence).

2
Può essere. Cosa succede se il mio server delle applicazioni include slf4je 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 solo java.util.loggingin produzione, e allora?
Elliott Frisch

Grazie per aver scritto. Ma, se tutti usano log4j a livello di org, l'argomento sopra non sarà valido.
Andy897

4
L'uso di SLF4J significa che la sostituzione dell'implementazione è molto semplice se la politica aziendale cambia, ad esempio quando la tua azienda viene acquisita e nuove politiche vengono imposte a te. L'uso di SLF4J ora, quando scrivi il codice, non richiederà più tempo rispetto all'utilizzo diretto di Log4j. La sostituzione delle chiamate dirette di Log4j in un secondo momento richiederà molto tempo. SLF4J è un investimento / assicurazione gratuito per il futuro. È più importante delle funzionalità API di Log4j 2? Solo tu (o la politica aziendale) puoi deciderlo.
Andreas

C'è anche un modo per usare slf4j con log4j2 se lo desideri? Questa pagina mostra l'utilizzo con log4j - versione 1.2 - che è terminata), ma nessuna opzione per log4j2. Se c'è un modo, perché slf4j non lo menziona?
J marmotta,

Risposte:


162

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-slf4jmodulo 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.

log4j-to-slf4j

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:

Le dipendenze richieste sono simili per SLF4J e l'API Log4j 2


7
Capisco. Lasciami riformulare la mia domanda. Esistono implementazioni indipendenti dell'API log4j2 diverse da log4j2?
Ceki

5
L'API Log4j2 e impl non sono "strettamente accoppiati". Tutte queste implementazioni SLF4J sono tutte disponibili: un'applicazione codificata in base all'API Log4j2 può selezionare la log4j-to-slf4jdipendenza invece di log4j-coree scegliere una qualsiasi di queste implementazioni SLF4J che hai menzionato. Il numero di nativi implementazioni del Log4j2 API è irrilevante.
Remko Popma

19
Il problema è che spesso si hanno dipendenze da librerie che esse stesse usano slf4j, quindi è più facile attenersi a questo.
Davio

18
quindi, dovrei usare un'interfaccia per un'interfaccia per un'implementazione? Sì, no grazie ... Slf4j ha battuto log4j sul pugno fornendo una buona interfaccia all'implementazione per la registrazione ... log4j2 dovrebbe semplicemente implementare l'api slf4j - se c'è una funzionalità mancante, contribuisci indietro, se slf4j non accetta il nuovo , quindi FORSE c'è un caso per le interfacce API log4j2 ...
RockMeetHardplace

4
@RemkoPopma - stai ancora sostenendo di non usare l'interfaccia log4j. Sì, ho capito - posso concatenare l'interfaccia di log4j2 -> l'interfaccia di slf4j -> qualunque sia l'implementazione, ma preferirei non astrarre l'astrazione - grazie ma no grazie.
RockMeetHardplace
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.