Projekt Twiggy jest na wczesnym etapie, aby zbudować więcej pythonic pakiet rejestrowania. Wymagania :
Sposób użycia:
Dodać do pracy wyświetlacza:
>>> import sys; sys.stderr = sys.stdout
Konfiguracja jest prosta
W swojej main.py:
>>> Import Twiggy
>>> Twiggy.quick_setup ()
logu
>>> Z importu Twiggy *
Główny interfejs jest magia dziennika:
>>> Zalogować #doctest: + wielokropka
To działa po wyjęciu z pudełka, przy użyciu standardowych poziomów:
>>> Log.debug ("Nie możesz obchodzi")
DEBUG: Nie możesz dbać
>>> Log.error ("OMFG! Spodnie w ogniu!")
BŁĄD: OMFG! Spodnie w ogniu!
Obsługuje wiele łańcuchów formatu, nie stawili się do nowego stylu:
>>> Log.info ("Noszę {0} na moim {gdzie}", "spodnie", gdzie = 'nogi')
INFO: Noszę spodnie, na nogach
Stary styl działa dobrze, ale:
>>> Log.options (style = "procent"). Informacji ("Lubię% s", "rowery")
INFO: Lubię rowery
Jak zrobić szablony:
>>> Log.options (style = "dolar"). Informacje ('$ co kill ", co =' Cars ')
INFO: zabić Samochody
Możesz wymienić swoje rejestratorów:
>>> Mylog = log.name ("Alfredo")
>>> Mylog.debug ("cześć")
DEBUG: Alfredo: hello
Ale nazwa nie ma związku z przedmiotem; to tylko do stosowania u ludzi:
>>> Mylog jest log.name ("Alfredo")
Fałszywy
Emitujące wiadomości
Emitery są luźno powiązane:
>>> Twiggy.emitters #doctest: + wielokropka
{'*':
Można ustawić min_level emiterów:
>>> twiggy.emitters ['*']. min_level = twiggy.Levels.INFO
>>> Log.debug ("Pomocy, pomocy mam tłumiona")
>>> Log.info ("Nie jestem jeszcze całkiem martwy")
INFO: Jeszcze nie jestem całkiem martwy
Możesz filtrować regexes, lub z dowolnych funkcji:
>>> twiggy.emitters ['*']. Filtr = ". * *" spodnie.
>>> Log.info ("Masz moje {0} na", "spodnie")
INFO: Masz moje spodnie
>>> Log.info ("Masz moje {0} on", "koszula")
Miejmy zresetować wszystko:
>>> twiggy.emitters ['*']. Filtr = True
>>> twiggy.emitters ['*']. min_level = twiggy.Levels.DEBUG
Lepsze wyjście
Znaki nowej linii są tłumione domyślnie; które mogą być wyłączone per-wiadomości:
>>> Log.info ('user nWstaw nannoys nus ")
INFO: user nWstaw nannoys nus
>>> log.options (suppress_newlines = false) .info ("my ndeal")
INFO: my
sprawa
Wyjątki są poprzedzone. Można również przekazać exc_info. Użyj ' n' jako przedrostek złożyć w jednej linii:
>>> Spróbować:
... 1/0
... Z wyjątkiem:
... Log.trace ("błąd") Ostrzeżenie ("O") #doctest sieci doskonałości. + Wielokropka
OSTRZEŻENIE: oh NoEs
TRACE Traceback (najnowsze połączenie ostatni):
TRACE File "
TRACE 1/0
TRACE ZeroDivisionError: podział całkowita lub modulo przez zero
Sposób Łańcuch
Lubię ten styl przykuty dużo.
>>> Log.name ("Benito"). Informacje ('Cześć')
INFO: Benito: Cześć
To sprawia, że zorganizowany rejestrowanie proste:
>>> log.fields (ścieżki = 42) .info ("Idąc na spacer")
INFO: ścieżki = 42: Idąc na spacer
Skrót. Świetne dla statystyki środowiska wykonawczego zgromadzenia.
>>> Log.struct (ścieżki = 42, delfiny = "wdzięczny")
INFO: delfiny = wdzięcznych: ścieżki = 42:
Częściowego wiązania może być użyteczny do webapps:
>>> Per_request_log = log.fields (request_id = '12345')
>>> Per_request_log.fields (wiersze = 100, user = 'Frank'). Informacji ("frobnicating bazy danych")
INFO: request_id = 12345: wiersze = 100: user = szczerze: baza frobnicating
>>> per_request_log.fields (bajtów = 5678), .info ("wysyłania strony na rurach")
INFO: bajtów = 5678: request_id = 12345: wysyłanie strony na rurach
Przykuty styl jest niesamowity:
>>> ("Sexy" Spodnie =). Informacje log.name ("donjuan"). Pola ("hello, {, którzy chcą {}}, co?", Który = "panie", co = "taniec")
INFO: donjuan: spodnie = sexy: witam, panie do tańca?
Dynamiczne!
Wszelkie funkcje w args / pola są nazywane i wartości podstawione:
>>> import os
>>> Z importu thread_name twiggy.lib
>>> Thread_name ()
"MainThread"
>>> log.fields (pid = os.getpid) .info ("jestem w wątku {0}", thread_name) #doctest: + wielokropka
INFO: pid = 1076: Jestem w wątku MainThread
Może to być przydatne częściowo związane z rejestratorów, które pozwalają to nam zrobić kilka fajnych rzeczy:
>>> Klasy ThreadTracker (object):
... Def __init __ (self, obj):
... Samo .__ obj = obj
... # Częściowo związany rejestrator
... Samo .__ zalogować = log.name ("tracker"). Pola (obj_id = id (obj), gwint = thread_name)
... Samo .__ log.debug ("rozpoczął śledzenie")
... Def __getattr __ (self, atr):
... Samo .__ log.debug ("obejrzano {0}", atr)
... Powrót getattr (self .__ obj, atr)
...
>>> Klasy Bunch (object):
... Przejść
...
>>> Foo = Bunch ()
>>> Foo.bar = 42
>>> Śledzone = ThreadTracker (foo)
DEBUG: tracker: obj_id = 14063980: gwint = MainThread: rozpoczął śledzenie
>>> Tracked.bar
DEBUG: tracker: obj_id = 14063980: gwint = MainThread: dostępne bar
42
>>> Import gwintowania
>>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler")
>>> T.start ()
DEBUG: tracker: obj_id = 14063980: gwint = TheDoubler: dostępne bar
Jeśli naprawdę chcesz, aby zalogować się wpłacone, repr () go lub zawiń go w lambda.
Optymalizacja
Jako optymalizacji min_level można ustawić na rejestratorów:
>>> Mylog.min_level = twiggy.Levels.INFO
>>> Mylog.info ("Widzisz to")
INFO: Alfredo: to zobaczyć
>>> Mylog.debug ("To jest ukryty")
Biorą również filtr, który działa na format_spec. Przypadek użycia jest skutecznie odcinając konkretne wiadomości w bibliotece, która robi coś głupiego:
>>> Mylog.filter = lambda s: "shenanigans" nie s
>>> Mylog.info ("Uruchamianie głupotę")
INFO: Alfredo: od głupota
>>> For i in xrange (3): # dla dużych wartości 3
... Mylog.info ("Wzywam shenanigans!")
>>> Mylog.info ("End głupotę")
INFO: Alfredo: Koniec głupota p>
Szczegóły programowe:
Komentarze nie znaleziono