Untuk debugging sederhana dalam proyek yang kompleks, adakah alasan untuk menggunakan python logger daripada print? Bagaimana dengan kasus penggunaan lainnya? Apakah ada kasus penggunaan terbaik yang diterima untuk masing-masing (terutama ketika Anda hanya mencari stdout)?
Saya selalu mendengar bahwa ini adalah "praktik terbaik" tetapi saya belum dapat menemukan alasannya.
print
.print
adalah untuk menampilkan pesan bantuan untuk pengguna di aplikasi baris perintah.Jawaban:
Paket logging memiliki banyak fitur berguna:
Print tidak memiliki semua ini.
Juga, jika proyek Anda dimaksudkan untuk diimpor oleh alat python lain, itu praktik yang buruk bagi paket Anda untuk mencetak sesuatu ke stdout, karena pengguna kemungkinan besar tidak akan tahu dari mana pesan cetak itu berasal. Dengan logging, pengguna paket Anda dapat memilih apakah mereka ingin menyebarkan pesan logging dari alat Anda atau tidak.
sumber
Salah satu keuntungan terbesar dari logging yang tepat adalah Anda dapat mengkategorikan pesan dan mengaktifkan atau menonaktifkannya tergantung pada apa yang Anda butuhkan. Misalnya, mungkin berguna untuk mengaktifkan pesan tingkat debugging untuk bagian tertentu dari proyek, tetapi kurangi untuk bagian lain, agar tidak diambil alih oleh informasi yang berlebihan dan untuk dengan mudah berkonsentrasi pada tugas yang Anda butuhkan penebangan.
Selain itu, log dapat dikonfigurasi. Anda dapat dengan mudah memfilternya, mengirimnya ke file, memformatnya, menambahkan cap waktu, dan hal lain yang mungkin Anda perlukan secara global. Pernyataan cetak tidak mudah dikelola.
sumber
Pernyataan cetak adalah jenis yang terburuk dari kedua dunia , menggabungkan aspek negatif dari debugger online dengan instrumentasi diagnostik. Anda harus memodifikasi program tetapi Anda tidak mendapatkan lebih banyak, kode yang berguna darinya.
Debugger online memungkinkan Anda memeriksa status program yang sedang berjalan; Tetapi hal yang menyenangkan tentang debugger yang sebenarnya adalah Anda tidak perlu memodifikasi sumbernya; baik sebelum maupun sesudah sesi debugging; Anda cukup memuat program ke dalam debugger, memberi tahu debugger di mana Anda ingin mencari, dan Anda sudah siap.
Menginstruksikan aplikasi mungkin memerlukan beberapa pekerjaan di depan, memodifikasi kode sumber dalam beberapa cara, tetapi keluaran diagnostik yang dihasilkan dapat memiliki banyak detail, dan dapat diaktifkan atau dinonaktifkan ke tingkat yang sangat spesifik. Modul logging python tidak hanya dapat menampilkan pesan yang dicatat, tetapi juga file dan fungsi yang memanggilnya, pelacakan balik jika ada, waktu sebenarnya saat pesan itu dikirim, dan seterusnya. Lebih dari itu; instrumentasi diagnostik tidak perlu dilepas; Ini sama valid dan bermanfaatnya saat program selesai dan dalam produksi seperti saat program ditambahkan; tetapi dapat membuat keluarannya macet di file log yang tidak mungkin mengganggu siapa pun, atau tingkat log dapat diturunkan untuk menyimpan semua kecuali pesan yang paling mendesak.
mengantisipasi kebutuhan atau penggunaan debugger benar-benar tidak lebih sulit daripada menggunakan ipython saat Anda menguji, dan menjadi terbiasa dengan perintah yang digunakannya untuk mengontrol debugger pdb bawaan.
Ketika Anda menemukan diri Anda berpikir bahwa pernyataan cetak mungkin lebih mudah daripada menggunakan pdb (seperti yang sering terjadi), Anda akan menemukan bahwa menggunakan logger menarik program Anda jauh lebih mudah untuk bekerja pada status daripada jika Anda menggunakan dan kemudian menghapus pernyataan cetak .
Saya memiliki editor saya dikonfigurasi untuk menyorot pernyataan cetak sebagai kesalahan sintaks , dan pernyataan pencatatan sebagai komentar, karena itu tentang bagaimana saya menganggapnya.
sumber
Jika Anda menggunakan logging maka orang yang bertanggung jawab untuk penyebaran dapat mengkonfigurasi logger untuk mengirimkannya ke lokasi kustom, dengan informasi kustom. Jika Anda hanya mencetak, hanya itu yang mereka dapatkan.
sumber
Logging pada dasarnya membuat database teks biasa dari hasil cetak dengan data meta lainnya (timestamp, loglevel, nomor baris, proses, dll.).
Ini emas murni, saya dapat menjalankan egrep di atas file log setelah skrip python dijalankan. Saya dapat menyetel pencarian pola egrep saya untuk memilih apa yang saya minati dan mengabaikan sisanya. Pengurangan beban kognitif dan kebebasan untuk memilih pola egrep saya nanti dengan coba-coba adalah manfaat utama bagi saya.
tail -f mylogfile.log | egrep "key_word1|key_word2"
Sekarang masukkan hal-hal keren lainnya yang tidak dapat dilakukan pencetakan (mengirim ke soket, mengatur level debug, logrotate, menambahkan data meta, dll.), Anda memiliki banyak alasan untuk lebih memilih masuk ke pernyataan cetak biasa.
Saya cenderung menggunakan pernyataan cetak karena malas dan mudah, menambahkan logging memerlukan beberapa kode pelat boiler, hai kami memiliki yasnippets (emacs) dan ultisnips (vim) dan alat template lainnya, jadi mengapa menyerah logging untuk pernyataan cetak biasa !?
sumber