Twiggy adalah proyek tahap awal untuk membangun paket logging lebih Pythonic. Penggunaan: Membuat karya layar: >>> Import sys; sys.stderr = sys.stdout Pengaturan sederhana Dalam main.py Anda: >>> Impor lemah >>> Twiggy.quick_setup () Logging Pesan >>> Dari lemah impor * Antarmuka utama adalah log sihir: >>> Log #doctest: + elipsis Ia bekerja di luar kotak, dengan menggunakan tingkat standar: >>> Log.debug ("Anda mungkin tidak peduli ') DEBUG: Anda mungkin tidak peduli >>> Log.error ('OMFG! Pants on fire!') ERROR: OMFG! Celana di atas api! Hal ini mendukung berbagai format string, default ke gaya baru: >>> Log.info ('saya memakai {0} pada saya {} mana', 'celana', di mana = 'kaki') INFO: Saya memakai celana di kaki saya Gaya lama bekerja dengan baik meskipun: >>> Log.options (style = 'persen') info. ('Aku suka% s', "sepeda") INFO: Saya suka sepeda Seperti halnya template: >>> Log.options (style = 'dolar') info. ('$ Apa kill', apa = 'Mobil') INFO: Mobil membunuh Anda dapat nama penebang Anda: >>> Mylog = log.name ('alfredo') >>> Mylog.debug ('halo') DEBUG: alfredo: hello Tapi nama tidak ada hubungannya dengan objek; itu hanya untuk digunakan manusia: >>> Mylog adalah log.name ('alfredo') Palsu Emitting Pesan Emitter yang longgar ditambah: >>> Twiggy.emitters #doctest: + elipsis {'*': } Anda dapat menetapkan min_level pada Emiten: >>> Twiggy.emitters ['*']. Min_level = twiggy.Levels.INFO >>> Log.debug ("Bantuan, bantuan saya sedang ditekan") >>> Log.info ("Aku tidak cukup mati belum") INFO: Saya tidak cukup mati belum Anda dapat menyaring pada regexes, atau dengan fungsi sewenang-wenang: >>> Twiggy.emitters ['*']. Filter = ". * Celana. *" >>> Log.info ("Punya saya {0} pada", "celana") INFO: Punya celana saya di >>> Log.info ("Punya saya {0} pada", "baju") Mari kita ulang semua bahwa: >>> Twiggy.emitters ['*'] Filter = True. >>> Twiggy.emitters ['*']. Min_level = twiggy.Levels.DEBUG keluaran yang lebih baik Baris ditekan secara default; yang dapat dimatikan per-pesan: >>> Log.info ('user ninput nannoys nus') INFO: user ninput nannoys nus >>> Log.options (suppress_newlines = False) .info ('kita ndeal') INFO: kita transaksi Pengecualian diawali. Bisa juga lewat exc_info. Gunakan ' n' sebagai awalan untuk melipat ke dalam satu baris: >>> Coba: ... 1/0 ... Kecuali: ... Log.trace ('error') peringatan ('oh noes') #doctest:. + Elipsis PERINGATAN: oh noes TRACE Traceback (paling panggilan terakhir terakhir): TRACE File "", baris 2, di TRACE 1/0 TRACE ZeroDivisionError: pembagian integer atau modulo dengan nol Cara Chaining Saya suka ini dirantai gaya banyak. >>> Log.name ('benito'). Info ('hi ada) INFO: benito: hi ada Itu membuat logging terstruktur mudah: >>> Log.fields (jalur = 42) .info ('Pergi untuk berjalan-jalan') INFO: jalan = 42: Pergi untuk berjalan-jalan Pintas. Besar untuk statistik runtime pertemuan. >>> Log.struct (jalur = 42, lumba-lumba = 'bersyukur') INFO: lumba-lumba = bersyukur: jalan = 42: Parsial mengikat dapat berguna untuk webapps: >>> Per_request_log = log.fields (request_id = '12345') >>> Per_request_log.fields (baris = 100, user = 'terang') info. ('Frobnicating database') INFO: request_id = 12345: baris = 100: user = frank: Database frobnicating >>> Per_request_log.fields (bytes = 5678) .info ('mengirimkan halaman lebih tabung') INFO: bytes = 5678: request_id = 12345: mengirim halaman lebih tabung Dirantai gaya mengagumkan: >>> ('Seksi' celana =) info log.name ('Donjuan'). Bidang. ("Halo, {} yang ingin {} apa?", Yang = 'wanita', apa = 'tarian') INFO: Donjuan: celana = sexy: hello, wanita ingin berdansa? Dinamis! Setiap fungsi dalam args / bidang dipanggil dan nilai substitued: >>> Os impor >>> Dari twiggy.lib impor thread_name >>> Thread_name () 'Mainthread' >>> Log.fields (pid = os.getpid) .info ("Aku di thread {0}", thread_name) #doctest: + elipsis INFO: pid = 1076: aku di thread mainthread Hal ini dapat berguna dengan penebang sebagian terikat, yang mari kita melakukan beberapa hal keren: >>> Kelas ThreadTracker (objek): ... Def __init __ (self, obj): ... Diri .__ obj = obj ... # Logger sebagian terikat ... Diri .__ log = log.name ("tracker"). Bidang (obj_id = id (obj), benang = thread_name) ... Diri .__ log.debug ("mulai pelacakan") ... Def __getattr __ (self, attr): ... Diri .__ log.debug ("diakses {0}", attr) ... Pulang getattr (self .__ obj, attr) ... >>> Kelas Bunch (objek): ... Lulus ... >>> Foo = Bunch () >>> Foo.bar = 42 >>> Dilacak = ThreadTracker (foo) DEBUG: tracker: obj_id = 14063980: benang = mainthread: mulai pelacakan >>> Tracked.bar DEBUG: tracker: obj_id = 14063980: benang = mainthread: bar diakses 42 >>> Impor threading >>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler") >>> T.start () DEBUG: tracker: obj_id = 14063980: benang = TheDoubler: bar diakses Jika Anda benar-benar ingin log callable, cetak ulang () atau bungkus dalam lambda. Optimasi Sebagai optimasi, min_level yang dapat diatur pada penebang: >>> Mylog.min_level = twiggy.Levels.INFO >>> Mylog.info ("Anda lihat ini") INFO: alfredo: Anda melihat ini >>> Mylog.debug ("Ini adalah tersembunyi") Mereka juga mengambil filter yang beroperasi pada format_spec. Penggunaan kasus secara efisien mematikan pesan tertentu di perpustakaan yang melakukan sesuatu yang bodoh: >>> Mylog.filter = lambda s: "shenanigans" tidak dalam s >>> Mylog.info ("Mulai kekonyolan") INFO: alfredo: Mulai kekonyolan >>> Untuk i di xrange (3): # untuk nilai-nilai besar dari 3 ... Mylog.info ("saya sebut shenanigans!") >>> Mylog.info ("End kekonyolan") INFO: alfredo: Akhir kekonyolan
Persyaratan :
11 May 15
Komentar tidak ditemukan