Ada Apa dengan Masuk di Java? [Tutup]

117

Mengapa seseorang akan menggunakan salah satu paket berikut daripada yang lain?

  • Java Logging
  • Commons Logging
  • Log4j
  • SLF4j
  • Masuk kembali
Loki
sumber
4
Anda mungkin ingin stackoverflow.com/questions/873051 , yang membandingkan SLF4j ke Commons Logging.
James McMahon
24
Mengapa Ceki menciptakan 3 kerangka kerja logging !!! kegilaan itu ...
mP.
6
@tokopedia - log4j adalah yang pertama, kemudian muncul ketidaksepakatan, dan slf4j + logback ditulis. slf4j adalah API dan logback implementasi API. Terlepas dari yang lainnya, slf4j sangat berguna.
Thorbjørn Ravn Andersen
3
Untuk detail tentang mengapa Ceki Gülcü benar-benar membuat SLF4J + Logback, lihat obrolan Devoxx berikut: parleys.com/#st=5&id=1701
bitek
Hal terbaik untuk keluar dari ini adalah API slf4j yang diharapkan akan menyatukan dunia logging. Saya pikir logback belum mencapai masa kritis dengan pengembang.
Thorbjørn Ravn Andersen

Jawaban:

86

Dalam urutan kronologis munculnya api (sejauh yang saya tahu):

  • Log4j karena kebanyakan orang menggunakannya (menurut pengalaman saya)
  • Commons Logging karena proyek open source menggunakannya (sehingga mereka dapat berintegrasi dengan kerangka logging apa pun yang digunakan dalam solusi terintegrasi); sangat valid jika Anda adalah API / Framework / OSS dan Anda mengandalkan paket lain yang menggunakan Commons Logging.
  • Commons Logging karena Anda tidak ingin "mengunci" kerangka kerja logging tertentu (jadi Anda mengunci apa yang diberikan oleh Commons Logging) - Saya rasa tidak masuk akal untuk memutuskan menggunakan poin ini sebagai alasannya.
  • Java logging karena Anda tidak ingin menambahkan jar ekstra.
  • SLF4j karena ini lebih baru dari Commons Logging dan menyediakan logging berparameter:

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 + "."); 
}
  • Logback karena lebih baru dari log4j dan sekali lagi, mendukung logging berparameter, karena ia mengimplementasikan SLF4j secara langsung
  • SLF4j / Logback karena ini ditulis oleh orang yang sama yang melakukan log4j, jadi dia membuatnya lebih baik (menurut Ken G - terima kasih. Sepertinya cocok jika melihat postingan berita mereka sebelumnya )
  • SLF4j karena mereka juga menerbitkan adaptor log4j sehingga Anda tidak perlu "mengganti" log4j dalam kode yang lebih lama - cukup buat log4j.properties menggunakan SLF4j dan konfigurasinya
Stephen
sumber
3
Sejauh yang saya tahu ide di balik commons logging adalah bahwa itu harus digunakan di perpustakaan. Dengan cara ini pustaka selalu dapat menggunakan kerangka kerja logging yang sama (melalui logging umum) yang digunakan aplikasi hosting.
Joachim Sauer
Terima kasih banyak untuk Loki atas pertanyaannya. Sekarang saya tahu bahwa saya tidak akan menggunakan log4j sebagai framework default saya lagi. SLF4j FTW! Juga terima kasih kepada Ken G karena telah menunjukkan bahwa SLF4j ditulis oleh orang yang sama dengan log4j
Stephen
3
Komentar dalam contoh kode Anda tidak 100% benar. Pemformatan pesan yang sebenarnya dilakukan secara malas oleh Logback sehingga ini hanya akan terjadi jika acara benar-benar ditangani oleh appender dan appender memerlukan pesan yang diformat - yang tidak akan terjadi dalam kasus misalnya SocketAppender karena acara tersebut diserialkan menggunakan pola pesan yang tidak berubah + argumen sebagai String. Saya rasa itu tergantung bagaimana Anda mendefinisikan "secara efektif". Itu pasti akan memancarkan pesan yang sama (setidaknya jika entri dan objeknya sama;)) jadi mohon maafkan kesalahan saya.
Huxi
6
SLF4J sebenarnya hanyalah API yang berada di atas kerangka kerja logging lainnya. Mirip dengan tujuan Commons Logging, tetapi lebih intuitif dari pengalaman saya.
James McMahon
37

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.

Julien Chastang
sumber
19
Apakah ini jawaban? Ini lebih terlihat seperti kata-kata kasar.
Michael Myers
15
Saya menyesal. Ini adalah sedikit kata-kata kasar. Tapi ini juga merupakan respon meyakinkan untuk "Ada Apa dengan Logging di Java?". Jawabannya, singkatnya, adalah sangat rusak.
Julien Chastang
1
baik itu tidak bernilai -1 suara; P Tapi sesuatu untuk direnungkan.
guyumu
21
Masalahnya dimulai ketika Sun benar-benar menambahkan java.util.logging ke Java 1.4. Sebelumnya LOG4J sudah mapan dan digunakan secara luas. Setelah itu ada kebutuhan akan pembungkus untuk mendukung LOG4J dan java.util.logging. Juga, karena jul terdapat dalam paket java. *, Itu tidak dapat diganti dengan menukar JAR - yang merupakan cara SLF4J menjembatani kerangka kerja lainnya. Ini mungkin ide Sun terburuk yang pernah ada ... dan pada akhirnya mengarah pada asumsi yang salah bahwa "warga Jawa yang baik" harus menggunakan jul.
Huxi
4
@ Huxi, saya berpendapat bahwa API Kalender lebih buruk. Untuk membela Sun, itu bukan kode mereka, tetapi berasal dari Taglient.
Thorbjørn Ravn Andersen
22

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.

Huxi
sumber
2
Secara teknis, ini adalah Map <String, String> thread-local.
pdxleif
17

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.

Ken Gentle
sumber
4

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.

Markus Lausberg
sumber
4

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

kdgregory
sumber
1
Ada juga jembatan commons.logging => SLF4J yang dapat digunakan untuk merutekan semua CL logging melalui SLF4J. SLF4J mendukung bridging of commons.logging, LOG4J dan (agak rumit, tapi sebaik mungkin) java.util.logging sehingga semua log akan berakhir di backend SLF4J apa pun yang akan Anda gunakan. Lihat slf4j.org/legacy.html Saya akan menggunakan Logback, btw, tetapi Anda dapat membantah bahwa saya bias.
Huxi
2

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.

Michael Rutherfurd
sumber
Tidak keberatan ketergantungan pada 1.4 ?? Bahkan 1,4 telah mencapai akhir masa pakainya.
Tom Hawtin - tackline
2
@Tom Dia berarti jdk1.4 + jangan konyol.
mP.
Sebenarnya saya baru-baru ini melakukan beberapa pekerjaan dalam sistem yang masih berjalan di bawah jdk 1.3 :-(, dan itu kurang dari dua tahun yang lalu saya terakhir kali mempertahankan sistem jdk 1.2 . Terlalu banyak tempat tidak meningkatkan kecuali mereka benar-benar memiliki kepada, mereka hanya menolak untuk menginstal upgrade.
Michael Rutherfurd
0

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.

tsimon
sumber
2
Itulah yang dilakukan penebangan bersama, jadi mengapa menemukan kembali roda? Juga ada beberapa masalah yang harus ditangani oleh fasad Anda yang sudah dilakukan oleh penebangan bersama.
James AN Stauffer
+1 Untuk melawan argumen logging umum, Beberapa aplikasi perusahaan menggunakan logger kustom. Itu selalu merupakan ide yang baik untuk menyembunyikan implementasi yang mendasarinya. Pembungkus 'tipis' menghilangkan kebutuhan akan toples lain untuk dikemas dan tidak sebanyak menciptakan kembali.
questzen
1
Ini menyelamatkan saya baru-baru ini ketika kami memporting framework kami ke Compact Framework (dalam .Net). Jika kami memiliki dependensi hardcode pada nLog, kami akan kacau. Karena kami menggunakan pendekatan ini, kami dapat memasukkan logger nol dan menjadi bahagia. Seseorang memilih saya kembali ke 0 Tolong :-)
tsimon
3
Satu sudah ada - lihat slf4j. Ini adalah pembungkus tipis yang diterima yang memungkinkan Anda untuk mengganti kerangka kerja logging saat aplikasi dimulai dengan mengganti jar pada jalur kelas runtime.
deterb
1
penyumbatan memiliki caranya sendiri untuk menemukan kerangka kerja apa yang akan digunakan - itu tidak bagus dan agak tertekan. Berapa banyak kerangka kerja logging yang dibuat Ceki. Seseorang harus selalu berusaha untuk menempatkan level interdirection dan menyembunyikan implementasi bahkan jika itu tersumbat dengan logging Anda sendiri. Di belakang layar Anda kemudian dapat melakukan plugin apa pun yang Anda inginkan seperti yang disebutkan oleh Travis.
mP.