Mengapa seseorang akan menggunakan salah satu paket berikut daripada yang lain?
- Java Logging
- Commons Logging
- Log4j
- SLF4j
- Masuk kembali
Mengapa seseorang akan menggunakan salah satu paket berikut daripada yang lain?
Jawaban:
Dalam urutan kronologis munculnya api (sejauh yang saya tahu):
logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
// Note that it's actually *more* efficient than this - see Huxi's comment below...
logger.debug("The entry is " + entry + ".");
}
Menurut saya logging di Java membingungkan, tidak konsisten, tidak terdokumentasi dengan baik, dan terutama serampangan. Selain itu, ada banyak sekali kesamaan antara kerangka kerja logging ini yang mengakibatkan duplikasi upaya, dan kebingungan tentang lingkungan logging apa Anda sebenarnya berada. Khususnya, jika Anda bekerja dalam tumpukan aplikasi web Java yang serius, Anda sering banyaklingkungan logging pada satu waktu; (misalnya hibernate dapat menggunakan log4j, dan java.util.logging tomcat). Apache commons dimaksudkan untuk menjembatani kerangka kerja logging yang berbeda, tetapi sebenarnya hanya menambahkan lebih banyak kerumitan. Jika Anda tidak mengetahui hal ini sebelumnya, itu benar-benar membingungkan. Mengapa pesan log saya tidak tercetak ke konsol, dll.? Ohh karena saya melihat log Tomcat, dan bukan log4j. Menambahkan lapisan kompleksitas lainnya, server aplikasi mungkin memiliki konfigurasi pencatatan log global yang mungkin tidak mengenali konfigurasi lokal untuk aplikasi web tertentu. Terakhir, semua kerangka kerja logging ini JAUH TERLALU RUMIT. Logging di Java telah menjadi kekacauan yang tidak teratur membuat pengembang seperti saya frustrasi dan bingung.
Versi awal Java tidak memiliki kerangka kerja logging bawaan yang mengarah ke skenario ini.
Ada satu poin penting yang tidak disebutkan sebelumnya:
SLF4J (dan baik Logback maupun LOG4J sebagai backend logging) memiliki dukungan untuk apa yang disebut Mapped Diagnostic Context (MDC, lihat javadoc dan dokumentasi ).
Ini pada dasarnya adalah Peta <String, String> thread-lokal yang dapat Anda gunakan untuk menambahkan informasi konteks tambahan ke aktivitas logging Anda. Keadaan MDC saat ini dilampirkan ke setiap acara.
Ini bisa sangat berguna jika Anda memasukkan hal-hal seperti nama pengguna dan URL permintaan (untuk webapp) ke dalamnya. Ini dapat dilakukan secara otomatis menggunakan filter, misalnya.
Lihat juga jawaban atas pertanyaan Apa praktik terbaik untuk mencatat kesalahan? , khususnya:
Ada beberapa masalah pemuatan kelas potensial dengan Commons Logging.
Log4J dan SLF4J dikembangkan oleh orang yang sama, belajar dari masalah yang ditemukan dalam praktik dengan Log4J.
Dalam proyek perusahaan kami, kami menggunakan LOG4j dan sangat mudah digunakan seperti yang ditunjukkan Stephen dalam contohnya. Kami juga telah menulis kelas pola kami sendiri untuk LOG4j sehingga Anda dapat membuat skema file keluaran Anda sendiri. Anda dapat menjelaskan bagaimana file log Anda akan terlihat. Dimungkinkan untuk meningkatkan kelas log4j asli.
Semua properti LOG4j dapat Anda ubah dalam file log4j.properties, sehingga Anda dapat menggunakan file yang berbeda untuk proyek yang berbeda.
Java logging bukan favorit saya, tetapi ini bisa jadi karena saya menggunakan log4j sejak awal.
The Commons Logging ikhtisar memberikan alasan untuk keberadaannya: penebangan dari kode perpustakaan, bila Anda tidak memiliki kontrol atas kerangka penebangan yang mendasari. Sangat penting untuk berbagai proyek Apache, yang akan ditautkan ke aplikasi luar. Mungkin tidak begitu penting untuk proyek TI internal, di mana Anda memiliki kendali penuh.
Karena itu, saya menulis ke Commons Logging, seperti halnya banyak pengembang lain yang saya kenal. Alasannya adalah untuk meminimalkan beban mental: Anda dapat mengubah proyek atau pekerjaan, dan tidak perlu mempelajari kerangka kerja baru (asalkan pekerjaan / proyek baru juga menggunakan CL, dan / atau Anda dapat meyakinkan mereka untuk pindah ke sana).
Juga, ada beberapa nilai untuk membuat pembungkus Anda sendiri di sekitar kerangka kerja apa pun yang Anda gunakan. Seperti yang dijelaskan di sini , saya suka menggunakan objek LogWrapper untuk memberikan stringifikasi kustom (penting), dan meminimalkan kekacauan visual pernyataan logging (kurang penting).
Umumnya saya akan menggunakan Log4J secara default.
Saya akan menggunakan Java Logging jika saya tidak keberatan dengan ketergantungan pada Java 1.4 tetapi saya masih akan menggunakan Log4J sebagai preferensi.
Saya akan menggunakan Commons Logging jika saya meningkatkan sesuatu yang sudah menggunakannya.
Saya akan menyarankan untuk membuat fasad logging tipis yang dapat menulis ke salah satu kerangka logging, di mana pilihan mesin pendukung menjadi cukup banyak poin yang diperdebatkan.