Haruskah Anda Masuk Dari Kode Perpustakaan?

38

Jika saya mengembangkan perpustakaan Java, apakah praktik yang baik untuk mengeluarkan laporan log dari dalam kode perpustakaan?

Memiliki logging di dalam perpustakaan akan membuat debugging dan troubleshooting lebih transparan. Namun, di sisi lain, saya tidak suka membuang sampah sembarangan kode perpustakaan saya dengan pernyataan logging. Apakah ada implikasi kinerja yang perlu dipertimbangkan juga?

Denmark
sumber

Jawaban:

33

Ya kamu harus. Menggunakan fasad logging seperti SLF4J memberi Anda fleksibilitas tanpa membebani pengguna Anda dengan kerangka kerja logging tertentu.

Penulis komponen dan pustaka yang didistribusikan secara luas dapat mengkode terhadap antarmuka SLF4J untuk menghindari memaksakan kerangka kerja logging pada pengguna akhir komponen atau pustaka. Dengan demikian, pengguna akhir dapat memilih kerangka kerja logging yang diinginkan pada waktu penempatan dengan memasukkan slf4j yang sesuai yang mengikat pada classpath, yang dapat diubah kemudian dengan mengganti mengikat yang ada dengan yang lain pada jalur kelas dan memulai kembali aplikasi. Pendekatan ini terbukti sederhana dan sangat kuat.

Juga, jika pengguna Anda tidak menyertakan botol SLF4J (dari panduan pengguna ):

Pada SLF4J versi 1.6.0, jika tidak ada pengikatan ditemukan di jalur kelas, maka slf4j-api akan default ke implementasi tidak-operasi yang mengabaikan semua permintaan log.

Jika Anda khawatir tentang implikasi kinerja logging, lihat entri FAQ SLF4J ini . Idenya adalah Anda memberikan parameter untuk mencatat pernyataan alih-alih menambahkannya ke dalam sebaris string:

Dua baris berikut akan menghasilkan output yang sama persis. Namun, formulir kedua akan mengungguli formulir pertama dengan faktor setidaknya 30, dalam kasus pernyataan pembalakan yang dinonaktifkan.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

Apakah SLF4J merupakan fasad logging yang lain?

SLF4J secara konseptual sangat mirip dengan JCL. Dengan demikian, ini dapat dianggap sebagai fasad logging yang lain. Namun, SLF4J jauh lebih sederhana dalam desain dan bisa dibilang lebih kuat. Singkatnya, SLF4J menghindari masalah pemuat kelas yang mengganggu [Jakarta Commons Logging].

Mike Partridge
sumber
Apakah ada pustaka sumber terbuka yang baik yang mencatat dalam kode pustaka yang bisa Anda tunjuk? jadi kita bisa melihat bagaimana hal itu dilakukan?
user1870400
Kerangka Spring adalah perpustakaan Java yang cukup terkenal yang melakukan ini; dalam kasus mereka, mereka memilih JCL.
Mike Partridge
17

Ya , Anda harus masuk dari kode perpustakaan Anda. Ini tidak hanya membantu Anda berkembang, tetapi orang-orang yang menggunakan perpustakaan akan merasakan manfaatnya. Ingatlah bahwa Anda selalu dapat mengatur level logging hanya untuk menunjukkan pernyataan log yang Anda butuhkan - dan mereka dapat melakukan hal yang sama.

Baru-baru ini saya menggunakan Mybatis , alat ORM open source. Saya men-debug masalah di mana kueri yang saya pikir seharusnya benar tidak menghasilkan apa-apa. Itu adalah kueri parameter, dan karena Mybatis telah masuk dalam kode pustaka, saya bisa menyalakannya dan melihat kueri yang sebenarnya sedang dijalankan. Mudah untuk mengatakan bahwa saya menukar dua parameter. Tanpa masuk ke perpustakaan saya tidak bisa menemukan masalah secepat itu.

Michael K.
sumber