Lanjutkan: program ke API log4j2, bukan slf4j
Aman: Log4j2 API menawarkan jaminan yang sama persis dengan slf4j - dan banyak lagi.
Sekarang Log4j2 itu sendiri dipisahkan menjadi API dan modul implementasi, tidak ada lagi nilai dalam menggunakan SLF4J.
Ya, merupakan praktik teknik yang baik untuk tetap membuka opsi Anda. Anda mungkin ingin mengubah ke implementasi logging lain nanti.
Selama 10 tahun terakhir ini, membangun fleksibilitas seperti itu dalam aplikasi Anda berarti menggunakan API pembungkus seperti SLF4J. Fleksibilitas ini tidak datang secara gratis: kelemahan dari pendekatan ini adalah aplikasi Anda tidak dapat menggunakan kumpulan fitur yang lebih kaya dari perpustakaan logging yang mendasarinya.
Log4j2 menawarkan solusi yang tidak mengharuskan aplikasi Anda dibatasi pada penyebut umum terendah.
Katup pelepasan: log4j-to-slf4j
Log4j2 menyertakan log4j-to-slf4j
modul jembatan. Aplikasi apa pun yang dikodekan dengan Log4j2 API dapat memilih untuk mengalihkan implementasi pencadangan ke implementasi yang sesuai dengan slf4j kapan saja.
Seperti yang disebutkan dalam pertanyaan, menggunakan API Log4j2 secara langsung menawarkan lebih banyak fungsionalitas dan memiliki beberapa keuntungan non-fungsional dibandingkan menggunakan API pembungkus seperti slf4j:
- API Pesan
- Lambdas untuk lazy logging
- Catat Objek apa pun, bukan hanya String
- Bebas Sampah: hindari membuat vararg atau membuat String jika memungkinkan
- CloseableThreadContext secara otomatis menghapus item dari MDC setelah Anda selesai menggunakannya
(Lihat 10 fitur API Log4j2 tidak tersedia di SLF4J untuk lebih jelasnya.)
Aplikasi dapat dengan aman menggunakan fitur-fitur kaya Log4j2 API ini tanpa terkunci pada implementasi inti Log4j2 asli.
SLF4J masih merupakan katup pengaman Anda, itu tidak berarti aplikasi Anda harus mengkodekan API SLF4J lagi.
Pengungkapan: Saya berkontribusi ke Log4j2.
Pembaruan: Tampaknya ada beberapa kebingungan bahwa pemrograman ke API Log4j2 entah bagaimana memperkenalkan "fasad untuk fasad". Tidak ada perbedaan dalam hal ini antara API Log4j2 dan SLF4J.
Kedua API tersebut memerlukan 2 dependensi saat menggunakan implementasi native, dan 4 dependensi untuk implementasi non-native. SLF4J dan Log4j2 API identik dalam hal ini. Sebagai contoh:
slf4j
dan logback (atau log4jv1)? Haruskah saya kemudian dipaksa untuk menginstal pencatat ketiga untuk menggunakan aplikasi Anda? Atau mungkin keamanan perusahaan memutuskan Anda hanya boleh menggunakanjava.util.logging
dalam produksi, lalu bagaimana?