Dengan python, mengapa menggunakan logging daripada print?

92

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.

Sam Odio
sumber
3
Untuk proyek besar, logging selalu merupakan "praktik terbaik" karena Anda dapat dengan mudah mengaktifkan atau menonaktifkannya, dan mendapatkan lebih banyak atau lebih sedikit informasi. print tidak menawarkan keuntungan ini.
Chris Eberle
3
Saya rasa tidak pernah ada kasus penggunaan terbaik untuk print.
SingleNegationElimination
4
The dokumentasi python logging mengatakan kasus penggunaan terbaik untuk printadalah untuk menampilkan pesan bantuan untuk pengguna di aplikasi baris perintah.
licin
Membaca semua jawaban ini, saya ingin mengajukan pertanyaan sebaliknya: apakah pernah ada alasan untuk tidak menggunakan logging?
information_interchange

Jawaban:

101

Paket logging memiliki banyak fitur berguna:

  • Mudah untuk melihat di mana dan kapan (bahkan nomor baris apa) panggilan logging dibuat.
  • Anda dapat masuk ke file, soket, apa saja, semuanya pada saat yang bersamaan.
  • Anda dapat membedakan logging Anda berdasarkan tingkat keparahan.

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.

Ondrej Slinták
sumber
2
Kata yang sangat bagus. Saya kadang-kadang akan menggunakan print saat men-debug skrip sekali pakai yang ingin saya jalankan tepat satu kali, tetapi kode apa pun yang pernah dilihat oleh mata manusia lain atau yang dimaksudkan untuk bertahan lebih dari satu hari akan mendapatkan logger.
TimothyAWiseman
22

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.

membersihkan
sumber
3
Pasti +1 untuk mengirim keluaran ke file. Mengurai logfile di post-mortem jauh lebih baik daripada harus membuatnya rusak lagi di jendela konsol yang terbuka untuk menemukan kesalahan. Pada dasarnya, logger sangat ideal untuk setiap saat Anda perlu men-debug skrip setelah gagal daripada saat gagal. Ini juga ideal untuk setiap saat Anda harus men-debug masalah kompleks yang mengharuskan Anda menganalisis keluaran program. Pada dasarnya, setiap kali Anda berurusan dengan kesalahan yang lebih kompleks daripada kesalahan sintaks, logger mungkin akan menyederhanakannya untuk Anda.
Jonathanb
11

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.

SingleNegationElimination
sumber
4

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.

Ignacio Vazquez-Abrams
sumber
1

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 !?

tiktok
sumber