Pengantar SLF4J

1. Ikhtisar

Fasad Logging Sederhana untuk Java (disingkat SLF4J) - bertindak sebagai fasad untuk kerangka kerja logging yang berbeda (misalnya java.util.logging, logback, Log4j). Ia menawarkan API generik yang membuat logging independen dari implementasi sebenarnya.

Hal ini memungkinkan kerangka kerja logging yang berbeda untuk hidup berdampingan. Ini juga membantu bermigrasi dari satu kerangka kerja ke kerangka lainnya. Akhirnya, selain dari API standar, ia juga menawarkan beberapa "gula sintaksis".

Artikel ini akan membahas dependensi dan konfigurasi yang diperlukan untuk mengintegrasikan SLF4J dengan Log4j2, Logback, Log4J2 dan Jakarta Commons Logging. Selengkapnya tentang setiap implementasi ini dapat Anda baca di artikel Pengantar Logging Java.

2. Pengaturan Log4j2

Untuk menggunakan SLF4J dengan Log4j2, Anda harus menambahkan perpustakaan berikut ke 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 

Versi terbaru dapat ditemukan di sini: log4j-api, log4j-core, log4j-slf4j-impl.

Konfigurasi logging sebenarnya mengikuti konfigurasi asli Log4j 2. Mari kita lihat bagaimana instance Logger dibuat:

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"); } }

Perhatikan bahwa Logger dan LoggerFactory milik paket org.slf4j . Contoh proyek, berjalan dengan konfigurasi yang dijelaskan tersedia di sini.

3. Pengaturan Logback

Untuk menggunakan SLF4J dengan Logback, Anda tidak perlu menambahkan SLF4J ke classpath Anda. Logback sudah menggunakan SLF4J. Ini dianggap sebagai implementasi referensi. Kami hanya perlu menyertakan perpustakaan Logback:

 ch.qos.logback logback-classic 1.1.7 

Versi terbaru dapat ditemukan di sini: logback-classic.

Konfigurasinya khusus untuk Logback tetapi berfungsi mulus dengan SLF4J. Dengan dependensi dan konfigurasi yang tepat, kode yang sama dari bagian sebelumnya dapat digunakan untuk menangani logging.

4 . Pengaturan Log4j

Di bagian sebelumnya, kami membahas kasus penggunaan di mana SLF4J "duduk" di atas implementasi logging tertentu. Digunakan seperti ini, ini sepenuhnya mengabstraksi kerangka yang mendasarinya.

Ada beberapa kasus ketika solusi logging yang ada tidak dapat diganti, misalnya karena persyaratan pihak ketiga. Ini, bagaimanapun, tidak berarti bahwa proyek tersebut "dihukum" hanya untuk kerangka kerja yang sudah digunakan.

SLF4J dapat dikonfigurasi sebagai jembatan, di mana panggilan ke kerangka kerja yang ada dialihkan ke sana. Mari tambahkan dependensi yang diperlukan untuk membuat jembatan untuk Log4j:

 org.slf4j log4j-over-slf4j 1.7.30 

Dengan ketergantungan pada tempatnya (periksa yang terbaru di log4j-over-slf4j), semua panggilan ke Log4j akan dialihkan ke SLF4J. Pertimbangkan dokumentasi resmi untuk mempelajari lebih lanjut tentang menjembatani kerangka kerja yang ada.

Sama seperti framework lainnya, Log4j dapat berfungsi sebagai implementasi yang mendasarinya. Mari tambahkan dependensi yang diperlukan:

 org.slf4j slf4j-log4j12 1.7.30   log4j log4j 1.2.17 

Versi terbaru dapat ditemukan di sini untuk slf4j-log4j12 dan log4j. Proyek teladan, dikonfigurasi dengan cara yang dijelaskan tersedia di sini.

5. Pengaturan Jembatan JCL

Di bagian sebelumnya, kami menunjukkan bagaimana basis kode yang sama dapat digunakan untuk mendukung logging menggunakan implementasi yang berbeda. Meskipun ini adalah janji dan kekuatan utama SLF4J, ini juga merupakan tujuan di balik JCL (Jakarta Commons Logging atau Apache Commons Logging).

JCL, dengan maksudnya, merupakan kerangka kerja yang mirip dengan SLF4J. Perbedaan utama adalah bahwa JCL menyelesaikan implementasi yang mendasari selama waktu eksekusi melalui sistem pemuatan kelas. Pendekatan ini dianggap bermasalah jika ada pemuat kelas khusus yang berperan.

SLF4J menyelesaikan pengikatannya pada waktu kompilasi. Ini dianggap lebih sederhana namun cukup kuat.

Untungnya, dua kerangka kerja dapat bekerja bersama dalam mode jembatan:

 org.slf4j jcl-over-slf4j 1.7.30 

Versi dependensi terbaru dapat ditemukan di sini jcl-over-slf4j.

Seperti kasus lainnya, basis kode yang sama akan berjalan dengan baik. Contoh proyek lengkap yang menjalankan penyiapan ini tersedia di sini.

6. Lebih Lanjut Kebaikan SLF4J

SLF4J memberikan tambahan yang dapat membuat logging lebih efisien dan kode lebih mudah dibaca. Misalnya, SLF4J menyediakan antarmuka yang sangat berguna untuk bekerja dengan parameter:

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

Berikut adalah contoh kode Log4j yang melakukan hal yang sama:

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

Seperti yang Anda lihat, Log4j akan menggabungkan String terlepas dari level debug yang diaktifkan atau tidak. Dalam aplikasi beban tinggi, ini dapat menyebabkan masalah kinerja. SLF4J akan menggabungkan String hanya jika level debug diaktifkan. Untuk melakukan hal yang sama dengan Log4J Anda perlu menambahkan blok if ekstra yang akan memeriksa apakah level debug diaktifkan atau tidak:

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

SLF4J menstandarkan tingkat logging yang berbeda untuk implementasi tertentu. The FATAL tingkat penebangan punya turun (diperkenalkan pada Log4j) berdasarkan pada premis bahwa dalam kerangka penebangan, kita tidak harus memutuskan kapan aplikasi harus dihentikan.

Level logging yang digunakan adalah ERROR, WARN, INFO, DEBUG, TRACE . Anda dapat membaca selengkapnya tentang menggunakannya di artikel Pengantar Logging Java.

7. Kesimpulan

SLF4J membantu peralihan diam-diam antara kerangka kerja logging. Ini sederhana, namun fleksibel, dan memungkinkan pembacaan dan peningkatan kinerja.

Seperti biasa, kode dapat ditemukan di GitHub. Selain itu, kami mereferensikan dua proyek lain yang didedikasikan untuk artikel berbeda, tetapi berisi konfigurasi log yang dibahas, di sini dan di sini.