Twiggy este un proiect stadiu incipient pentru a construi un pachet mai pythonic logare.
Utilizare:
Face munca de afișare:
>>> sys import; sys.stderr = sys.stdout
Configurarea este simpla
In main.py dumneavoastră:
>>> Twiggy import
>>> Twiggy.quick_setup ()
Mesaje Logging
>>> Din Twiggy import *
Interfata principala este jurnalul magică:
>>> Log #doctest: + elipsă
Acesta acționează afară de la cutie, utilizând nivelurile standard:
>>> Log.debug ("Nu pot pasa")
DEBUG: Nu pot pasa
>>> Log.error ("OMFG! Pantaloni pe foc!")
EROARE: OMFG! Pantaloni pe foc!
Acesta suportă o varietate de siruri de caractere format, obligațiile de stil nou:
>>> Log.info ("am purta {0} pe {mea unde}", "pantaloni", în cazul în care = '' picioare)
INFO: Am purta pantaloni pe picioarele mele
Stil vechi funcționează bine, deși:
>>> Log.options (style = 'la sută "). Info (" Îmi place% s "," biciclete ")
INFO: Îmi place biciclete
La fel ca șabloane:
>>> Log.options (style = "dolar"). Info ("$ ce ucide", ceea ce = 'Cars ")
INFO: Cars ucide
Puteți denumi exploatare tale:
>>> Mylog = log.name ('Alfredo')
>>> Mylog.debug ("salut")
DEBUG: alfredo: hello
Dar numele nu are nici o legătură cu obiectul; e doar pentru uz uman:
>>> Mylog este log.name ("Alfredo")
Fals
Mesaje emițătoare
Emițători sunt slab cuplate:
>>> Twiggy.emitters #doctest: + elipsă
{"*":
Puteți seta o min_level pe Emitters:
>>> twiggy.emitters ['*']. min_level = twiggy.Levels.INFO
>>> Log.debug ("Ajutor, ajutor eu fiind suprimat")
>>> Log.info ("Eu nu sunt destul de mort încă")
INFO: Eu nu sunt destul de mort încă
Puteți filtra pe regexes, sau cu funcții arbitrare:
>>> twiggy.emitters ['*']. filtru = ". * pants. *"
>>> Log.info ("Ai mei {0} pe", "pants")
INFO: Am pantalonii pe
>>> Log.info ("Ai mei {0} pe", "camasa")
Să reseta toate:
>>> twiggy.emitters ['*']. filtru = True
>>> twiggy.emitters ['*']. min_level = twiggy.Levels.DEBUG
mai bună ieșire
Liniile sunt suprimate în mod implicit; care poate fi oprit pe-mesaj:
>>> Log.info ("user ninput nannoys NUS")
INFO: user ninput nannoys NUS
>>> log.options (suppress_newlines = false) .info ("noi ndeal")
INFO: am
afacere
Excepții sunt prefixate. De asemenea, poate trece exc_info. Utilizați " n" ca un prefix de ori într-o singură linie:
>>> Try:
... 1/0
... Cu excepția:
... Log.trace ("eroare") avertisment ("RE oh") #doctest:. + Elipsă
AVERTISMENT: oh RE
TRACE Traceback (cel mai recent apel ultima):
TRACE File "
TRACE 1/0
TRACE ZeroDivisionError: divizare întreg sau modulo la zero
Metoda Înlănțuirea
Îmi place acest stil inlantuit mult.
>>> Log.name ("Benito"). Info ("hi acolo")
INFO: Benito: hi acolo
Se face simplu de logare structurat:
>>> log.fields (căi = 42) .info ("merge pentru o plimbare")
INFO: căi = 42: merge pentru o plimbare
Tăiat scurt. Mare pentru colectarea statisticilor de rulare.
>>> Log.struct (căi = 42, delfini = 'recunoscător')
INFO: delfini = recunoscători: căi = 42:
Legare parțială poate fi util pentru aplicații web:
>>> Per_request_log = log.fields (request_id = '12345')
>>> Per_request_log.fields (rânduri = 100, ghidul de = 'sincer'). Info ("frobnicating baza de date")
INFO: request_id = 12345: rânduri = 100: user = frank: baza de date frobnicating
>>> per_request_log.fields (bytes = 5678) .info ("trimiterea pagina pe tuburi")
INFO: bytes = 5678: request_id = 12345: trimite pagina pe tuburi
Stilul legat este minunat:
>>> Domenii log.name ("donjuan"). (Pantaloni = 'sexy'). Info ("Bună ziua, {} care doresc să {} ce?", Care a = 'femei, ceea ce =' dance ')
INFO: donjuan: pantaloni = sexy: Buna ziua, doamnelor vrei să dansezi?
dinamic!
Orice funcții în args / câmpuri sunt numite și valoarea substituit:
>>> os import
>>> Din twiggy.lib thread_name import
>>> Thread_name ()
"MainThread"
>>> log.fields (pid = os.getpid) .info ("Sunt în șirul {0}", thread_name) #doctest: + elipsă
INFO: pid = 1076: Sunt in fir MainThread
Acest lucru poate fi util cu furnizori de bustean parțial legate, care Să ne facem niște chestii misto:
>>> ThreadTracker clasa (obiect):
... Def automat metodei __init __ (self, obj):
... Auto .__ obj = obj
... # Un logger legat parțial
... Auto .__ log = log.name ("tracker"). Domenii (obj_id = id (obj), filet = thread_name)
... De sine .__ log.debug ("a început urmărirea")
... __getattr Def __ (self, attr):
... De sine .__ log.debug ("accesat {0}", attr)
... Getattr retur (auto .__ obj, attr)
...
>>> Clasa Bunch (obiect):
... Treci
...
>>> Foo = Bunch ()
>>> Foo.bar = 42
>>> Urmarite = ThreadTracker (foo)
DEBUG: tracker: obj_id = 14063980: filet = MainThread: a început urmărirea
>>> Tracked.bar
DEBUG: tracker: obj_id = 14063980: filet = MainThread: bar accesate
42
>>> Filetat import
>>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler")
>>> T.start ()
DEBUG: tracker: obj_id = 14063980: filet = TheDoubler: bar accesate
Dacă într-adevăr doriți să vă conectați o nevărsat repr () sau înveliți-o în lambda.
Optimizări
Ca o optimizare, un min_level poate fi setat pe exploatare:
>>> Mylog.min_level = twiggy.Levels.INFO
>>> Mylog.info ("Tu vezi aceasta")
INFO: alfredo: Vezi asta
>>> Mylog.debug ("Aceasta este ascunsă")
Ei iau, de asemenea, un filtru care opereaza pe format_spec. Cazul de utilizare este eficient închiderea mesaje specifice într-o bibliotecă care este de a face ceva stupid:
>>> Mylog.filter = lambda s: "comice" nu s
>>> Mylog.info ("Începând imbecilitate")
INFO: alfredo: imbecilitate de pornire
>>> For i in xrange (3): # pentru valori mari de 3
... Mylog.info ("eu numesc comice!")
>>> Mylog.info ("End imbecilitate")
INFO: alfredo: End imbecilitate
Cerințe :
- Python
Comentariile nu a fost găsit