Twiggy daha Pythonic günlük paketi oluşturmak için bir erken evre projesidir.
Kullanım:
Ekran çalışmasını sağlayın:
>>> Import sys; sys.stderr = sys.stdout
Kurulum basittir
Senin main.py In:
>>> Import twiggy
>>> Twiggy.quick_setup ()
Günlüğü Mesajlar
>>> Twiggy import *
Ana arayüzü sihirli log:
>>> #doctest Log: + ELLIPSIS
<0x ... at twiggy.Logger.Logger object>
Standart seviyeleri kullanılarak, kutunun dışında çalışır:
>>> Log.debug ('umurunda olmayabilir')
DEBUG: Umurunda değil
>>> Log.error ('OMFG! Yanıyor Pantolon!')
HATA: OMFG! Yangın Pantolon!
Yeni tarzı varsaymak, biçim dizeleri çeşitli destekler:
>>> Log.info ('I {0} giymek benim {} Burada', 'pantolon', nerede = 'bacaklar')
BILGI: Ben ayakları üzerinde pantolon giymek
Eski stil olsa çalışıyor:
>>> Log.options (style = 'yüzde'). Bilgi ("Ben% s seviyorum '," bisiklet ")
BILGI: Ben bisiklet istiyorum
Gibi şablonlar yapın:
>>> Log.options (style = 'dolar'). Bilgi ('$ nasıl öldürmek' ne = 'Arabalar')
BILGI: Arabalar öldürmek
Siz kaydediciler adlandırabilirsiniz:
>>> MyLOG = log.name ('alfredo'),
>>> Mylog.debug ('merhaba')
DEBUG: Alfredo: merhaba
Ama isim nesnesine ilişkisi yoktur; Sadece insan kullanımı için değil:
>>> MyLOG ('alfredo') log.name olduğu
Yanlış
Yayan Mesajlar
Emitörler gevşek edilir:
>>> Twiggy.emitters #doctest + ELLIPSIS
{'*': <0x ... at twiggy.Emitter.Emitter object>}
Sen Yayıcıların bir min_level ayarlayabilirsiniz:
>>> Twiggy.emitters ['*']. Min_level = twiggy.Levels.INFO
>>> Log.debug ("Yardım, yardım ben bastırılmış oluyorum")
>>> Log.info ("Ben henüz oldukça ölmedim")
BILGI: Ben henüz oldukça ölmedim
Sen regexes üzerine, ya da keyfi fonksiyonlar ile filtre:
>>> Twiggy.emitters ['*']. Filtre = ". * Pantolon. *"
>>> Log.info ("Got benim {0} üzerinde", "pantolon")
BILGI: benim pantolonumu Got
>>> Log.info ("gömlek" "Benim {0} üzerinde Got")
En tüm bu reset edelim:
>>> Twiggy.emitters ['*']. Filtre = true
>>> Twiggy.emitters ['*']. Min_level = twiggy.Levels.DEBUG
Daha Çıktı
Satırsonu varsayılan olarak bastırılır; Bu her ileti kapatılabilir:
>>> Log.info ('kullanıcı ninput nannoys nus')
BILGI: kullanıcı ninput nannoys nus
(Çünkü biz ndeal ') .info >>> log.options (suppress_newlines = false)
BILGI: Biz
anlaşma
İstisnalar öneki. Ayrıca exc_info geçebilir. Tek bir satır içine katlamak bir önek olarak ' n' kullanın:
>>> Try:
... 1/0
... Hariç:
... Log.trace ('error'), ('Ah kabul etmeyenler') #doctest uyarı:. + ELLIPSIS
UYARI: oh kabul etmeyenler
İZ traceback (en son çağrı son):
İZ Dosyası "
İZ 1/0
İZ ZeroDivisionError: sıfıra bölme tamsayı veya modül
Yöntem zincirleme
Ben bu zincirleme tarzı çok seviyorum.
>>> Log.name ('benito.') Bilgi ('merhaba orada')
BILGI: benito: merhaba orada
Çok kolay yapılandırılmış günlüğü yapar:
>>> Log.fields (yolları = 42) .info ('yürüyüşe gitmek')
BILGI: yolları = 42: yürüyüşe gidiyor
Kısa kesilmiş. Çalışma zamanı istatistik toplama için harika.
>>> Log.struct (yolları = 42, yunuslar = 'müteşekkir')
BILGI: yunuslar = müteşekkir: yolları = 42:
Kısmi webapps için yararlı olabilir bağlama:
>>> Per_request_log = log.fields (request_id = '12345'),
>>> Per_request_log.fields (satırlar = 100 kullanıcı = 'frank'). Bilgi ('veritabanı frobnicating')
BILGI: request_id = 12345: satır = 100: user = frank: frobnicating veritabanı
>>> Per_request_log.fields (bayt = 5678) .info ('tüplerin üzerinde sayfa gönderme')
BILGI: bayt = 5678: request_id = 12345: tüpler üzerinde sayfa gönderme
Zincirli tarzı Başar:
>>> Log.name ('donjuan.') Alanlar (pantolon = 'seksi.') Bilgi ("merhaba, {} kim istiyor {} Ne?", Kim = 'bayan' ne = 'dans')
BILGI: donjuan: pantolon = sexy: merhaba, bayanlar dans etmek ister misin?
Dinamik!
Args / alanlarda herhangi bir fonksiyon denir ve değeri ikame edilir:
>>> Import os
>>> Twiggy.lib ithalat thread_name gelen
>>> Thread_name ()
'MainThread'
+ Ellipsis: ("Ben thread yaşıyorum {0}", thread_name) #doctest .info >>> log.fields (pid = os.getpid)
BILGI: pid = 1076: Ben iplik MainThread yaşıyorum
Bu bize biraz serin şeyler yapmak olduğunu izin kısmen bağlı loggers ile yararlı olabilir:
>>> Sınıf ThreadTracker (nesne):
... Def __init __ (self, obj):
... Kendini .__ obj = obj
... # Kısmen bağlı logger
... Kendini = log.name ("izci") log .__. Alanlar (obj_id = id (obj), iplik = thread_name)
... Kendini .__ log.debug ("izleme başlatan")
... Def __ __getattr (kendini, attr):
... Kendini .__ log.debug ("erişilen {0}", attr)
... Dönüş getattr (öz .__ obj, attr)
...
>>> Sınıf Bunch (nesne):
... Pas
...
>>> Foo = Bunch ()
>>> Foo.bar = 42
>>> Izlenen = ThreadTracker (foo)
DEBUG: izci: obj_id = 14063980: thread = MainThread: izlemeye başladı
>>> Tracked.bar
DEBUG: izci: obj_id = 14063980: thread = MainThread: erişilen bar
42
>>> Import parçacığı
>>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler")
>>> T.start ()
DEBUG: izci: obj_id = 14063980: thread = TheDoubler: erişilen bar
Eğer gerçekten) (o bir çağrılabilir, repr yapın veya lambda bunu sarmak istiyorum.
Optimizasyonları
Bir optimizasyon olarak, bir min_level kaydedicileri ayarlanabilir:
>>> Mylog.min_level = twiggy.Levels.INFO
>>> Mylog.info ("Bunu görmek")
BILGI: alfredo: Bu bakınız
>>> Mylog.debug ("Bu gizli")
Onlar da format_spec üzerinde çalışan bir filtre alın. kullanma durumu verimli aptalca bir şey yapıyor bir kütüphanede belirli mesajlar kapalı kapatılıyor:
>>> Mylog.filter = lambda s: "maskaralık" değil s
>>> Mylog.info ("sersemlik başlatılması")
BILGI: alfredo: Başlangıç sersemlik
>>> Xrange i (3): 3 büyük değerleri arasında
... Mylog.info ("Kurnazlık diyorum!")
>>> Mylog.info ("sersemlik End")
BILGI: alfredo: Bitiş sersemlik
Gereksinimleri :
- Python
Yorum Bulunamadı