Twiggy je v rané fázi projektu na vybudování více Pythonic protokolování balíček.
Použití:
Značka zobrazení práce:
>>> import sys; sys.stderr = sys.stdout
Nastavení je jednoduché
Ve vašem main.py:
>>> Import Twiggy
>>> Twiggy.quick_setup ()
Těžební Zprávy
>>> Z Twiggy import *
Hlavní rozhraní je magie protokolu:
>>> Log #doctest: + Ellipsis
Funguje po vybalení z krabice, s použitím standardních úrovní:
>>> Log.debug ("Nesmíte péče")
DEBUG: Můžete nezajímá
>>> Log.error ("OMFG! Kalhoty na ohni!")
CHYBA: OMFG! Kalhoty v plamenech!
To podporuje celou řadu formátovacích řetězcích, prodlení, k novému stylu:
>>> Log.info ("nosím {0} na mé {}, kde", "kalhoty", kde = "nohy")
INFO: nosím kalhoty na nohou
Starý styl funguje dobře i když:
>>> Log.options (style = "procento"). Info ("Mám rád% s", "kola")
INFO: Mám rád motorky
Jak dělat šablony:
>>> Log.options (style = "dolar"). Info ('$ co kill ", co =" Cars ")
INFO: Auta zabít
Můžete pojmenovat své lesní dělníky:
>>> MyLog = log.name ('Alfredo ")
>>> Mylog.debug ("ahoj")
DEBUG: Alfredo: ahoj
Ale název nemá žádný vztah k objektu; je to jen pro humánní použití:
>>> MyLog je log.name ("Alfredo")
Falešný
emitující Zprávy
Vysílače jsou volně spojeny:
>>> Twiggy.emitters #doctest: + Ellipsis
{"*":
Můžete nastavit min_level na Emitters:
>>> twiggy.emitters ['*']. min_level = twiggy.Levels.INFO
>>> Log.debug ("Help, help mě někdo potlačena")
>>> Log.info ("já nejsem ještě tak úplně mrtvý")
INFO: Já nejsem ještě tak úplně mrtvý
Můžete filtrovat na regexes, nebo s libovolnými funkcemi:
>>> twiggy.emitters ['*']. filtr = ". * kalhoty *."
>>> Log.info ("mám {0} na", "kalhoty")
INFO: Máte mé kalhoty
>>> Log.info ("mám {0} na", "košile")
Pojďme resetovat vše, co:
>>> twiggy.emitters ['*']. filtr = True
>>> twiggy.emitters ['*']. min_level = twiggy.Levels.DEBUG
Lepší výkon
Nové řádky jsou potlačeny ve výchozím nastavení; které lze vypnout per-zprávy:
>>> Log.info ("uživatel ninput nannoys nus")
INFO: user ninput nannoys nus
>>> log.options (suppress_newlines = false) .info ("my ndeal")
INFO: my
obchod
Výjimky jsou označeny písmenem. Může také projít exc_info. ' N' použít jako prefix složit do jednoho řádku:
>>> Try:
... 1/0
... S výjimkou:
... Log.trace ("chyba"), varování ("Ach sítí excelence") #doctest:. + Elipsa
VAROVÁNÍ: oh sítě excelence
TRACE traceback (poslední hovor poslední):
TRACE File "
TRACE 1/0
TRACE ZeroDivisionError: integer dělení nebo modulo nulou
Metoda řetězení
Líbí se mi tento připoutaný styl hodně.
>>> Log.name ("Benito"). Info ("hi there")
INFO: Benito: Hi there
To dělá strukturované protokolování snadné:
>>> log.fields (cesty = 42) .info ("jít na procházku")
INFO: cesty = 42: jít na procházku
Krátký střih. Skvělé pro runtime statistik setkání.
>>> Log.struct (cesty = 42, delfíni = "vděčný")
INFO: Dolphins = vděčný: cesty = 42:
Částečné vazba může být užitečné pro webapps:
>>> Per_request_log = log.fields (request_id = '12345')
>>> Per_request_log.fields (řádky = 100, user = "upřímný"). Info ("frobnicating databáze")
INFO: request_id = 12345: řádky = 100: user = frank: frobnicating databáze
>>> per_request_log.fields (bajtů = 5678) .info ("odesílání strana přes trubek")
INFO: bajty = 5678: request_id = 12345: posílání stránku nad trubek
Připoutaný styl je úžasné:
>>> Log.name ("donjuan"). Polí (kalhoty = 'sexy'). Info ("ahoj, {}, kteří chtějí, aby {} co?", Který = "dámy", co = "tanec")
INFO: donjuan: kalhoty = sexy: Dobrý den, dámy chtějí tančit?
Dynamický!
Veškeré funkce v args / polích se nazývají a hodnota střídat:
>>> import os
>>> Z twiggy.lib import thread_name
>>> Thread_name ()
"MainThread"
>>> log.fields (pid = os.getpid) .info ("Jsem v závitu {0}", thread_name) #doctest: + Ellipsis
INFO: pid = 1076: Jsem v závitu MainThread
To může být užitečné, s částečně-vázaných dřevorubci, který pojďme nám udělat nějaké cool věci:
>>> Třída ThreadTracker (objekt):
... Def __init __ (self, obj):
... Vlastní .__ obj = obj
... # Částečně vázaný záznamník
... Vlastní .__ log = log.name ("trackeru"). Pole (obj_id = id (obj), závit = thread_name)
... Vlastní .__ log.debug ("začal tracking")
... Def __getattr __ (self, attr):
... Vlastní .__ log.debug ("přístup k {0}", attr)
... Návrat getattr (self .__ obj, attr)
...
>>> Třída Bunch (objekt):
... Projít
...
>>> Foo = Bunch ()
>>> Foo.bar = 42
>>> Sledoval = ThreadTracker (foo)
DEBUG: tracker: obj_id = 14063980: závit = MainThread: začal sledování
>>> Tracked.bar
DEBUG: tracker: obj_id = 14063980: závit = MainThread: přistupovat bar
42
>>> Import závitů
>>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler")
>>> T.start ()
DEBUG: tracker: obj_id = 14063980: závit = TheDoubler: přistupovat bar
Pokud opravdu chcete, aby přihlásit na disponibilní, repr () ji nebo ji zabalte do lambda.
Optimalizace
Jako optimalizace, min_level může být nastavena na měřicí ústředny:
>>> Mylog.min_level = twiggy.Levels.INFO
>>> Mylog.info ("Vidíte to")
INFO: Alfredo: Vidíte to
>>> Mylog.debug ("To je skrytý")
Oni také vzít filtr, který funguje na format_spec. Use case je účinně vypnutí konkrétní zprávy do knihovny, který se dělá něco hloupého:
>>> Mylog.filter = lambda s "vylomeniny" není v S
>>> Mylog.info ("Spuštění hloupost")
INFO: Alfredo: Spuštění hloupost
>>> For i ve xrange (3): # pro velké hodnoty 3
... Mylog.info ("já říkám vylomeniny!")
>>> Mylog.info ("End hloupost")
INFO: Alfredo: Konec hloupost
Požadavky na :
- Python
Komentáře nebyl nalezen