Twiggy é um projeto em estágio inicial para construir um pacote de logging mais Pythonic.
Uso:
Fazer trabalho de exibição:
>>> import sys; sys.stderr = sys.stdout
A configuração é simples
Em sua main.py:
>>> Twiggy importação
>>> Twiggy.quick_setup ()
mensagens de log
>>> From importação twiggy *
Interface principal é o registo de magia:
>>> Log #doctest: + ELLIPSIS
Ela trabalha fora da caixa, usando níveis padrão:
>>> Log.debug ('Você pode não se importar')
DEBUG: Você pode não se importar
>>> Log.error ("OMFG! Calças no fogo! ')
ERRO: OMFG! Calças no fogo!
Ele suporta uma variedade de cordas do formato, padronizando em novo estilo:
>>> Log.info ("Eu uso {0} no meu {} onde ',' calças ', onde =' pernas ')
INFO: eu usar calças nas pernas
Estilo antigo funciona bem no entanto:
>>> Log.options (style = 'por cento). Info ("Eu gosto% s'," bicicletas ")
INFO: Eu gosto de bicicletas
Como fazer modelos:
>>> Log.options (style = "dólar"). Info ('$ que matar ", o que =' Carros ')
INFO: Carros matar
Você pode nomear seus madeireiros:
>>> Mylog = log.name ('Alfredo')
>>> Mylog.debug ('Olá')
DEBUG: alfredo: Olá
Mas o nome não tem relação com o objeto; é apenas para uso humano:
>>> Mylog é log.name ('Alfredo')
Falso
Mensagens Emitting
Emissores são de baixo acoplamento:
>>> Twiggy.emitters #doctest: + ELLIPSIS
{'*':
Você pode definir um min_level em Emissores:
>>> twiggy.emitters ["*"]. min_level = twiggy.Levels.INFO
>>> Log.debug ("Ajuda, ajuda que eu estou sendo suprimida")
>>> Log.info ("Eu não sou completamente morto ainda")
INFO: Eu não sou completamente morto ainda
Você pode filtrar em expressões regulares, ou com funções arbitrárias:
>>> twiggy.emitters ["*"]. filtro = ". *. *" calças
>>> Log.info ("Tenho o meu {0} de", "pants")
INFO: Tenho minhas calças
>>> Log.info ("Tenho o meu {0} em", "camisa")
Vamos redefinir tudo o que:
>>> twiggy.emitters ["*"]. filtro = True
>>> twiggy.emitters ["*"]. min_level = twiggy.Levels.DEBUG
melhor saída
Novas linhas são suprimidas por padrão; que pode ser desligado por mensagem:
>>> Log.info ("usuário ninput nannoys nus ')
INFO: utilizador ninput nannoys Nus
>>> log.options (suppress_newlines = false) .info ("nós Ndeal ')
INFO: nós
Combinado
Exceções são prefixados. Pode também passar exc_info. Utilize ' n' como um prefixo para dobrar em uma única linha:
>>> Try:
... 1/0
... Exceto:
... Log.trace ('error') aviso ('oh não') #doctest.: + ELLIPSIS
AVISO: oh não
TRACE Traceback (most recent call last):
TRACE File "
TRACE 1/0
TRACE ZeroDivisionError: divisão inteira ou modulo por zero
Método encadeamento
Eu gosto deste estilo acorrentado muito.
>>> Log.name ('Benito'). Info ('oi lá')
INFO: Benito: oi lá
Faz log estruturado fácil:
>>> log.fields (caminhos = 42) .info ("Indo para um passeio ')
INFO: caminhos = 42: Indo para um passeio
Atalho. Ótimo para coleta estatísticas de tempo de execução.
>>> Log.struct (caminhos = 42, golfinhos = 'gratos')
INFO: golfinhos = agradecidos: caminhos = 42:
Parcial de ligação podem ser úteis para aplicações web:
>>> Per_request_log = log.fields (request_id = '12345')
>>> Per_request_log.fields (linhas = 100, user = "franca"). Info ('frobnicating banco de dados')
INFO: request_id = 12345: linhas = 100: user = franquia: banco de dados frobnicating
>>> per_request_log.fields (bytes = 5,678) .info ("enviar página sobre os tubos ')
INFO: bytes = 5678: request_id = 12345: envio de página sobre os tubos
Acorrentado estilo é impressionante:
>>> Log.name ('DonJuan'). Campos (calções = 'sexy'). Info ("Olá, {que} {querem} o que?", Que = 'ladies', o que = 'dance')
INFO: Donjuán: calças = sexy: Olá, senhoras querem dançar?
dinâmico!
Quaisquer funções em args / campos são chamados eo valor substituído:
>>> import os
>>> From twiggy.lib importação thread_name
>>> Thread_name ()
'MainThread'
>>> log.fields (pid = os.getpid) .info ("Eu estou na linha {0}", thread_name) #doctest: + ELLIPSIS
INFO: pid = 1076: Eu estou no MainThread fio
Isso pode ser útil com madeireiros parcialmente ligados, que nós vamos fazer algumas coisas legais:
>>> ThreadTracker classe (objeto):
... Def __init __ (self, obj):
... Self .__ obj = obj
... # Um logger parcialmente ligado
... Self .__ log = log.name ("rastreador"). Campos (obj_id = id (obj), linha = thread_name)
... Self .__ log.debug ("tracking iniciado")
... Def __getattr __ (self, attr):
... Self .__ log.debug ("acessada {0}", attr)
... Retorno getattr (self .__ obj, attr)
...
>>> Class Bunch (objeto):
... Passar
...
>>> Foo = Bunch ()
>>> Foo.bar = 42
>>> Rastreados = ThreadTracker (foo)
DEBUG: rastreador: obj_id = 14063980: thread = MainThread: começou a acompanhar
>>> Tracked.bar
DEBUG: rastreador: obj_id = 14063980: thread = MainThread: bar acessado
42
>>> Segmentação de importação
>>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler")
>>> T.start ()
DEBUG: rastreador: obj_id = 14063980: thread = TheDoubler: bar acessado
Se você realmente quiser registrar uma exigível, repr () ou envolvê-la em lambda.
Optimizations
Como uma otimização, uma min_level pode ser definido em loggers:
>>> Mylog.min_level = twiggy.Levels.INFO
>>> Mylog.info ("Você vê isso")
INFO: alfredo: Você vê isso
>>> Mylog.debug ("Este é oculto")
Eles também ter um filtro que opera em format_spec. O caso de uso é eficientemente desligar mensagens específicas em uma biblioteca que está fazendo algo estúpido:
>>> Mylog.filter = lambda s: "travessuras" não em s
>>> Mylog.info ("Iniciando disparate")
INFO: alfredo: bobagem Começando
>>> For i in xrange (3): # para grandes valores de 3
... Mylog.info ("Eu chamo shenanigans!")
>>> Mylog.info ("End disparate")
INFO: alfredo: bobagem End
Requisitos :
- Python
Comentários não encontrado