Python'da, neden yazdırmak yerine günlüğe kaydetmeyi kullanalım?


92

Karmaşık bir projede basit hata ayıklama için print yerine python logger'ı kullanmak için bir neden var mı? Peki ya diğer kullanım durumları? Her biri için kabul edilen bir en iyi kullanım durumu var mı (özellikle sadece standart çıktı arıyorsanız)?

Bunun bir "en iyi uygulama" olduğunu her zaman duymuşumdur, ancak nedenini çözemedim.


3
Büyük projeler için günlük kaydı her zaman bir "en iyi uygulama" dır çünkü onu kolayca açıp kapatabilir ve daha fazla veya daha az bilgi alabilirsiniz. print bu avantajların hiçbirini sunmaz.
Chris Eberle


3
En iyi kullanım durumu olduğunu hiç sanmıyorum print.
SingleNegationElimination

4
Piton günlüğü belgeleri için en iyi kullanım durumu diyor printbir komut satırı uygulamasında kullanıcı için yardım mesajları göstermektir.
slushy

İçin bir neden orada hiç edilmektedir: Bütün bu cevapları okuma, ben ters soru sormak istiyorum değil kullanımı günlük?
information_interchange

Yanıtlar:


101

Günlük paketi birçok yararlı özelliğe sahiptir:

  • Bir kayıt çağrısının nerede ve ne zaman (hatta no.) Yapıldığını görmek kolaydır.
  • Dosyalara, soketlere, hemen hemen her şeye aynı anda giriş yapabilirsiniz.
  • Günlük kayıtlarınızı önem derecesine göre ayırt edebilirsiniz.

Baskı bunlardan hiçbirine sahip değil.

Ayrıca, projenizin diğer python araçları tarafından içe aktarılması gerekiyorsa, paketinizin işleri standart çıktıya yazdırması kötü bir uygulamadır, çünkü kullanıcı büyük olasılıkla basılı mesajların nereden geldiğini bilemeyecektir. Günlük kaydı ile, paketinizin kullanıcıları, aracınızdan günlük mesajlarını yaymak isteyip istemediklerini seçebilirler.


2
Çok güzel söyledi. Bazen tam olarak bir kez çalıştırmayı planladığım bir komut dosyası hatalarını ayıklarken yazdırma kullanacağım, ancak diğer insan gözü tarafından görülebilecek veya bir günden fazla sürmesi amaçlanan herhangi bir kod günlük kaydedici alır.
TimothyAWiseman

22

Doğru günlüğe kaydetmenin en büyük avantajlarından biri, mesajları kategorize edebilmeniz ve neye ihtiyacınız olduğuna bağlı olarak onları açıp kapatabilmenizdir. Örneğin, projenin belirli bir bölümü için hata ayıklama seviyesi mesajlarını açmak yararlı olabilir, ancak aşırı bilgi yüklemesi tarafından devralınmamak ve ihtiyaç duyduğunuz göreve kolayca konsantre olmak için diğer bölümler için tonu azaltmak yararlı olabilir. Kerestecilik.

Ayrıca günlükler yapılandırılabilir. Bunları kolayca filtreleyebilir, dosyalara gönderebilir, biçimlendirebilir, zaman damgaları ekleyebilir ve küresel bazda ihtiyaç duyabileceğiniz diğer her şeyi yapabilirsiniz. Baskı beyanları kolay yönetilmez.


3
Dosyalara çıktı göndermek için kesinlikle +1. Post-mortem'de bir günlük dosyasını ayrıştırmak, hatayı bulmak için açık bir konsol penceresinde yeniden kırmaktan çok daha iyidir. Temel olarak, bir günlükleyici, komut dosyası hata verirken değil, başarısız olduktan sonra hata ayıklamanız gereken her zaman için idealdir. Ayrıca, program çıktısını analiz etmenizi gerektiren karmaşık bir problemin hatalarını gidermeniz gerektiğinde idealdir. Temel olarak, sözdizimi hatalarından daha karmaşık hatalarla her uğraştığınızda, bir kaydedici muhtemelen bunu sizin için basitleştirecektir.
Jonathanb

11

Çevrimiçi bir hata ayıklayıcının olumsuz yönlerini tanı araçlarıyla birleştiren basılı ifadeler, her iki dünyanın en kötüsüdür . Yapmalisin programı değiştirmek ama alamadım daha kullanışlı kod ondan.

Çevrimiçi bir hata ayıklayıcı, çalışan bir programın durumunu incelemenizi sağlar; Ancak gerçek bir hata ayıklayıcının güzel yanı, kaynağı değiştirmenize gerek olmamasıdır; hata ayıklama oturumundan ne önce ne de sonra; Programı hata ayıklayıcıya yükleyin, hata ayıklayıcıya nereye bakmak istediğinizi söyleyin ve artık hazırsınız.

Uygulamanın enstrümantasyonu, kaynak kodunu bir şekilde değiştirerek önceden biraz çalışma gerektirebilir, ancak ortaya çıkan tanı çıktısı çok fazla ayrıntıya sahip olabilir ve çok özel bir dereceye kadar açılıp kapatılabilir. Python günlüğe kaydetme modülü yalnızca günlüğe kaydedilen mesajı değil, aynı zamanda onu çağıran dosya ve işlevi, varsa bir geri dönüşü, mesajın yayınlandığı gerçek zamanı vb. De gösterebilir. Daha Fazlası; teşhis aletlerinin asla kaldırılmasına gerek yoktur ; Program tamamlandığında ve üretimde eklendiği gün olduğu kadar geçerli ve kullanışlıdır; ancak çıktısının kimseyi rahatsız etmeyeceği bir günlük dosyasına sıkışmış olabilir veya en acil mesajlar dışında tümünü saklamak için günlük seviyesi kapatılabilir.

Bir hata ayıklayıcının ihtiyacını veya kullanımını tahmin etmek, test ederken ipython kullanmaktan ve yerleşik pdb hata ayıklayıcıyı kontrol etmek için kullandığı komutlara aşina olmaktan gerçekten daha zor değildir.

Kendinizi bir print cümlesinin pdb kullanmaktan daha kolay olabileceğini düşündüğünüzde (çoğu zaman olduğu gibi), bir logger kullanmanın, programı kullanmaktan çok daha kolay bir duruma getirdiğini göreceksiniz. .

Editörüm, yazdırma ifadelerini sözdizimi hataları olarak vurgulayacak ve ifadeleri de yorum olarak günlüğe kaydedecek şekilde yapılandırdım , çünkü onları bu şekilde değerlendiriyorum.


4

Günlük kaydı kullanıyorsanız, dağıtımdan sorumlu kişi, kaydediciyi özel bilgilerle özel bir konuma gönderecek şekilde yapılandırabilir. Sadece yazdırırsanız, elde ettikleri budur.


1

Günlük kaydı, esasen diğer meta verilerle (zaman damgası, loglevel, satır numarası, işlem vb.) Baskı çıktılarının aranabilir bir düz metin veritabanı oluşturur.

Bu saf altın, python betiği çalıştırıldıktan sonra günlük dosyası üzerinde egrep çalıştırabilirim. Egrep kalıp aramamı tam olarak ilgilendiğimi seçmek ve geri kalanını yok saymak için ayarlayabilirim. Bilişsel yükteki bu azalma ve daha sonra deneme yanılma yoluyla egrep modelimi seçme özgürlüğü benim için en önemli avantajdır.

tail -f mylogfile.log | egrep "key_word1|key_word2"

Şimdi, yazdırmanın yapamayacağı diğer harika şeyleri (sokete gönderme, hata ayıklama seviyelerini ayarlama, logrotate, meta veri ekleme vb.) Atın, günlük yazmayı düz baskı ifadelerine tercih etmek için her türlü nedeniniz var.

Yazılı ifadeleri kullanma eğilimindeyim çünkü tembel ve kolay, günlük kaydı eklemek için bazı kazan plakası kodu gerekiyor, hey, yasnippets (emacs) ve ultisnips (vim) ve diğer şablonlama araçlarına sahibiz, öyleyse neden düz baskı ifadeleri için günlüğe kaydetmekten vazgeçin !?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.