Pengenalan kepada SLF4J

1. Gambaran keseluruhan

Simple Logging Facade untuk Java (disingkat SLF4J) - bertindak sebagai fasad untuk kerangka kerja pembalakan yang berbeza (mis. Java.util.logging, logback, Log4j). Ia menawarkan API generik yang menjadikan pembalakan bebas daripada pelaksanaan sebenar.

Ini membolehkan pelbagai rangka pembalakan wujud bersama. Ia juga membantu berpindah dari satu kerangka ke kerangka yang lain. Akhirnya, selain daripada API standard, ia juga menawarkan beberapa "gula sintaksis".

Artikel ini akan membincangkan pergantungan dan konfigurasi yang diperlukan untuk mengintegrasikan SLF4J dengan Log4j2, Logback, Log4J2 dan Jakarta Commons Logging. Lebih lanjut mengenai setiap pelaksanaan ini, anda boleh membaca dalam artikel Pengenalan Pembalakan Java.

2. Persediaan 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 terkini boleh didapati di sini: log4j-api, log4j-core, log4j-slf4j-impl.

Konfigurasi pembalakan sebenarnya mematuhi konfigurasi Log4j 2 asli. Mari lihat bagaimana contoh 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 bahawa Logger dan LoggerFactory tergolong dalam pakej org.slf4j . Contoh projek, berjalan dengan konfigurasi yang dijelaskan boleh didapati di sini.

3. Persediaan Log Masuk

Untuk menggunakan SLF4J dengan Logback anda tidak perlu menambahkan SLF4J ke classpath anda. Log masuk sudah menggunakan SLF4J. Ia dianggap sebagai pelaksanaan rujukan. Kami hanya perlu memasukkan perpustakaan Log Balik:

 ch.qos.logback logback-classic 1.1.7 

Versi terbaru boleh didapati di sini: logback-classic.

Konfigurasinya khusus untuk Logback tetapi berfungsi dengan lancar dengan SLF4J. Dengan kebergantungan dan konfigurasi yang sesuai, kod yang sama dari bahagian sebelumnya dapat digunakan untuk menangani pembalakan.

4 . Persediaan Log4j

Pada bahagian sebelumnya, kami membahas kasus penggunaan di mana SLF4J "duduk" di atas pelaksanaan pembalakan tertentu. Digunakan seperti ini, ia sepenuhnya menghilangkan kerangka asas.

Terdapat kes apabila penyelesaian pembalakan yang ada tidak dapat diganti misalnya kerana keperluan pihak ketiga. Namun, ini tidak berarti bahwa proyek tersebut "dihukum" hanya untuk kerangka yang sudah digunakan.

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

 org.slf4j log4j-over-slf4j 1.7.30 

Dengan kebergantungan yang ada (periksa terkini di log4j-over-slf4j), semua panggilan ke Log4j akan dialihkan ke SLF4J. Pertimbangkan dokumentasi rasmi untuk mengetahui lebih lanjut mengenai merapatkan kerangka kerja yang ada.

Sama seperti kerangka kerja lain Log4j dapat berfungsi sebagai pelaksanaan yang mendasari. Mari tambahkan kebergantungan yang diperlukan:

 org.slf4j slf4j-log4j12 1.7.30   log4j log4j 1.2.17 

Versi terkini boleh didapati di sini untuk slf4j-log4j12 dan log4j. Projek teladan, dikonfigurasi dengan cara yang dijelaskan boleh didapati di sini.

5. Persediaan JCL Bridge

Pada bahagian sebelumnya, kami menunjukkan bagaimana asas kod yang sama dapat digunakan untuk menyokong pembalakan menggunakan implementasi yang berbeza. Walaupun ini adalah janji dan kekuatan utama SLF4J, itu juga merupakan tujuan di belakang JCL (Jakarta Commons Logging atau Apache Commons Logging).

JCL adalah, dengan niatnya, kerangka yang serupa dengan SLF4J. Perbezaan utama adalah bahawa JCL menyelesaikan pelaksanaan yang mendasari selama masa pelaksanaan melalui sistem pemuatan kelas. Pendekatan ini dianggap bermasalah dalam kes di mana ada pemuat kelas khusus yang bermain.

SLF4J menyelesaikan pengikatannya pada waktu kompilasi. Ia dirasakan lebih sederhana namun cukup kuat.

Nasib baik, dua kerangka dapat berfungsi bersama dalam mod jambatan:

 org.slf4j jcl-over-slf4j 1.7.30 

Versi ketergantungan terkini boleh didapati di sini jcl-over-slf4j.

Seperti kes-kes lain, asas kod yang sama akan berjalan lancar. Contoh projek lengkap yang menjalankan persediaan ini terdapat di sini.

6. Kebaikan SLF4J lebih lanjut

SLF4J memberikan tambahan yang dapat menjadikan pembalakan lebih cekap dan kod lebih mudah dibaca. Sebagai contoh, SLF4J menyediakan antara muka yang sangat berguna untuk bekerja dengan parameter:

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

Berikut adalah contoh kod Log4j yang melakukan perkara yang sama:

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

Seperti yang anda lihat, Log4j akan menggabungkan Strings tanpa mengira tahap debug diaktifkan atau tidak. Dalam aplikasi dengan beban tinggi, ini boleh menyebabkan masalah prestasi. SLF4J akan menggabungkan Strings hanya apabila tahap debug diaktifkan. Untuk melakukan perkara yang sama dengan Log4J anda perlu menambahkan blok if yang akan memeriksa sama ada tahap debug diaktifkan atau tidak

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

SLF4J menyeragamkan tahap pembalakan yang berbeza untuk pelaksanaan tertentu. Tahap pembalakan FATAL jatuh (diperkenalkan di Log4j) berdasarkan premis bahawa dalam kerangka pembalakan, kita tidak boleh memutuskan kapan aplikasi harus dihentikan.

Tahap pembalakan yang digunakan adalah ERROR, WARN, INFO, DEBUG, TRACE . Anda boleh membaca lebih lanjut mengenai menggunakannya dalam artikel Pengenalan Pembalakan Java.

7. Kesimpulannya

SLF4J membantu dengan pertukaran senyap antara kerangka kerja pembalakan. Ia ringkas, namun fleksibel, dan memungkinkan pembacaan dan peningkatan prestasi.

Seperti biasa, kodnya boleh didapati di GitHub. Sebagai tambahan, kami merujuk dua projek lain yang dikhaskan untuk artikel yang berbeza, tetapi mengandungi konfigurasi log yang dibincangkan, di sini dan di sini.