[python-brasil] Gerar LOG com nome de metodo/classe e arquivo automaticamente.

807 views
Skip to first unread message

Mario Augusto Mania

unread,
Mar 10, 2011, 11:11:14 PM3/10/11
to python...@yahoogrupos.com.br
Ola Pessoal

Bem, antigamente (e bota antigamente nisso hehehe), quando programava
em clipper, eu desenvolvi uma biblioteca para log, onde eu chamava uma
funcao assim:

log("Ola Mundo!")

E a saida no arquivo de log era assim:

1998-04-12 17:30:22 - cadastrocli.prg - testedelog() - Ola Mundo!

Ou seja, a funcao automaticamente colocava a data/hora, o nome do
programa fonte e a funcao ou procedimento de onde estava sendo
chamada.

Pergunto: Gostaria de fazer o mesmo em python, ou seja, criar um def,
ou classe, ou singleton, onde, nos meus arquivos fontes, eu pudesse
chamar algo parecido com que eu fazia em clipper, ou seja, somente a
mensagem, e ele "pegasse" o nome do programa a funcao/metodo onde ele
foi chamado? Fui claro? (ehehehhe)

Alguem tem ideia de como posso conseguir essas informacoes?

Atenciosamente

m3


------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html


Luciano Ramalho

unread,
Mar 11, 2011, 10:46:57 PM3/11/11
to python...@yahoogrupos.com.br, Mario Augusto Mania
2011/3/11 Mario Augusto Mania <mario...@gmail.com>:

> Ou seja, a funcao automaticamente colocava a data/hora, o nome do
> programa fonte e a funcao ou procedimento de onde estava sendo
> chamada.
>
> Pergunto: Gostaria de fazer o mesmo em python, ou seja, criar um def,
> ou classe, ou singleton, onde, nos meus arquivos fontes, eu pudesse
> chamar algo parecido com que eu fazia em clipper, ou seja, somente a
> mensagem, e ele "pegasse" o nome do programa a funcao/metodo onde ele
> foi chamado? Fui claro? (ehehehhe)

Claríssimo!

> Alguem tem ideia de como posso conseguir essas informacoes?

Dá uma olhada em

http://docs.python.org/library/logging.html

Boa sorte, Mario!

--
Luciano Ramalho
programador repentista || stand-up programmer
Twitter: @luciano

Joao S. O. Bueno

unread,
Mar 12, 2011, 7:47:00 AM3/12/11
to python...@yahoogrupos.com.br
Oi Mário -

De uma olahda também nos conceitos de "Aspected Oreinted programing"
e nos recuroso para Aspected Oriented com Python --
vai ver que dá pra fazer isso com Python - até sem
precisar de uma chamada específica a uma função de log de dentro do que
você quiser logar.

Se precisar de algum esclarecimento técnico - ou mesmo se achar que as
implementações
de Aspected Oriented Python ai não atendem, dê um toque.


A idéia da Programalção Orientada a aspectos é justamente facilitar a
fatoração de código que seria comum a várias funções ou métodos - como
logging, setup e finalização de segurança, manter integridade numérica
(entre contas, para apps. financeiras, por exemplo), sem precisar
repetir o código para fazer essas coisas em todos os métodos onde eles
vao aparecer -- a execução desse código comum é disparada por fatores
como tipos de objetos nos parâmetros de entrada, ou pelos nomes nos
métodos.

mas esse é um resumo bem grosseiro da coisa.


js
-><-


2011/3/12 Luciano Ramalho <ram...@gmail.com>:

Joao Matoso

unread,
Mar 12, 2011, 10:10:55 AM3/12/11
to python...@yahoogrupos.com.br

"Joao S. O. Bueno" <jsb...@python.org.br> escreveu:

Mario Augusto Mania

unread,
Mar 12, 2011, 11:07:15 AM3/12/11
to python...@yahoogrupos.com.br
Grande Luciano e Joao :)

Obrigado pelas respostas :)

Bem, seguinte, quanto ao logging, eu jah conhecia e usava :) É bacana,
porem, eu preciso especificar os niveis manualmente. Na caso, eu gostaria
que o metodo LOG fizesse a introspecção e determinasse dentro de qual
programa e dentro de qual metodo ele estava sendo chamado.

m3


[As partes desta mensagem que não continham texto foram removidas]

Leonardo Santagada

unread,
Mar 14, 2011, 9:35:30 AM3/14/11
to python...@yahoogrupos.com.br
2011/3/12 Mario Augusto Mania <mario...@gmail.com>:

>
> Bem, seguinte, quanto ao logging, eu jah conhecia e usava :) É bacana,
> porem, eu preciso especificar os niveis manualmente. Na caso, eu gostaria
> que o metodo LOG fizesse a introspecção e determinasse dentro de qual
> programa e dentro de qual metodo ele estava sendo chamado.
>

Dentro de um arquivo tu tem o __file__ que contem o nome do arquivo, e
objetos de função contem __name__ com o nome. Dá pra escrever um
decorador de função que imprime esses dados no começo da função ou
salvam eles num global que funções tuas de log podem ler.

O jeito mais hardcore e que vai destruir a performance do teu programa
é usar sys._getframe(1) numa função tua de log e ler os valores da
frame de execução 1 superior a que tu esta (o frame que chamou a tua
função). Isso é meio hack, e por exemplo no PyPy completamente mata a
performance do teu programa.


--
Leonardo Santagada

Allison

unread,
Mar 14, 2011, 10:29:42 AM3/14/11
to python...@yahoogrupos.com.br
Olá,

Então se é para logging, ao invés de tentar inventar algo você pode utilizar nada mais nada menos do que simples exceções, levanta excessões em todas os casos necessários e as trata de uma forma geral, com o módulo traceback você pode navegar entre o stack de exceções geradas (só com o tratamento de exceções você ja consegue tudo que precisa, mas caso queira um controle melhor o módulo traceback lhe ofecere) e formatar a saída para seu arquivo de log. Nas exceções já estão armazenadas todas estas informações que você precisa.

Outra alternativa seria utilizar o módulo inspect e fazer uma rotina própria ou derivada do módulo logging e utilizar estas informações, um exemplo simples [1].

Mesmo assim considero o uso de exceções mais justificável para a maioria dos casos.

[1] http://pastebin.com/Vr0zWjBu

A[]'s

--- Em python...@yahoogrupos.com.br, Mario Augusto Mania <mario.mania@...> escreveu


>
> Grande Luciano e Joao :)
>
> Obrigado pelas respostas :)
>
> Bem, seguinte, quanto ao logging, eu jah conhecia e usava :) É bacana,
> porem, eu preciso especificar os niveis manualmente. Na caso, eu gostaria
> que o metodo LOG fizesse a introspecção e determinasse dentro de qual
> programa e dentro de qual metodo ele estava sendo chamado.
>
> m3
>

> Em 12 de março de 2011 09:47, Joao S. O. Bueno <jsbueno@...>escreveu:
>
> >
> >
> > Oi Mário -
> >
> > De uma olahda também nos conceitos de "Aspected Oreinted programing"
> > e nos recuroso para Aspected Oriented com Python --
> > vai ver que dá pra fazer isso com Python - até sem
> > precisar de uma chamada específica a uma função de log de dentro do que
> > você quiser logar.
> >
> > Se precisar de algum esclarecimento técnico - ou mesmo se achar que as
> > implementações
> > de Aspected Oriented Python ai não atendem, dê um toque.
> >
> > A idéia da Programalção Orientada a aspectos é justamente facilitar a
> > fatoração de código que seria comum a várias funções ou métodos - como
> > logging, setup e finalização de segurança, manter integridade numérica
> > (entre contas, para apps. financeiras, por exemplo), sem precisar
> > repetir o código para fazer essas coisas em todos os métodos onde eles
> > vao aparecer -- a execução desse código comum é disparada por fatores
> > como tipos de objetos nos parâmetros de entrada, ou pelos nomes nos
> > métodos.
> >
> > mas esse é um resumo bem grosseiro da coisa.
> >
> > js
> > -><-
> >

> > 2011/3/12 Luciano Ramalho <ramalho@...>:
> >
> > > 2011/3/11 Mario Augusto Mania <mario.mania@...>:

Mario Augusto Mania

unread,
Mar 14, 2011, 10:32:46 AM3/14/11
to python...@yahoogrupos.com.br
Caro Allison

Muito interessante esta ideia de disparar excessoes e trata-las. Vou estudar
isso.

m3

Luciano Ramalho

unread,
Mar 14, 2011, 12:14:58 PM3/14/11
to python...@yahoogrupos.com.br, Mario Augusto Mania
2011/3/12 Mario Augusto Mania <mario...@gmail.com>:
> Bem, seguinte, quanto ao logging, eu jah conhecia e usava :) É bacana,
> porem, eu preciso especificar os niveis manualmente. Na caso, eu gostaria
> que o metodo LOG fizesse a introspecção e determinasse dentro de qual
> programa e dentro de qual metodo ele estava sendo chamado.

Ok, mas o módulo logging faz o diabo, a documentação é quase um livro.
Você leu esta parte dos docs:

http://docs.python.org/library/logging.html#logger-objects

Tem por exemplo este método:

"""
Logger.findCaller()
Finds the caller’s source filename and line number. Returns the
filename, line number and function name as a 3-element tuple.
"""

Tem certeza que o que vc quer fazer já não foi feito?

--
Luciano Ramalho
programador repentista || stand-up programmer
Twitter: @luciano


------------------------------------

Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:

Leonardo Santagada

unread,
Mar 14, 2011, 2:51:03 PM3/14/11
to python...@yahoogrupos.com.br
do fonte:

logging/__init__.py
73 # next bit filched from 1.5.2's inspect.py
74 def currentframe():
75 """Return the frame object for the caller's stack frame."""
76 try:
77 raise Exception
78 except:
79 return sys.exc_info()[2].tb_frame.f_back
80
81 if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
82 # done filching

Em suma, ele usa _getframe como eu falei (e pelo jeito é o que o
Allison falava do inspect, já q esse pedaço de código foi copiado de
lá para versões antigas) :D

É legal ter algo já pronto e eu vi que o findCaller é bem bonito e
suporta ironpython e outros interpretadores fora o cpython.

2011/3/14 Luciano Ramalho <ram...@gmail.com>:


> 2011/3/12 Mario Augusto Mania <mario...@gmail.com>:
>> Bem, seguinte, quanto ao logging, eu jah conhecia e usava :) É bacana,
>> porem, eu preciso especificar os niveis manualmente. Na caso, eu gostaria
>> que o metodo LOG fizesse a introspecção e determinasse dentro de qual
>> programa e dentro de qual metodo ele estava sendo chamado.
>
> Ok, mas o módulo logging faz o diabo, a documentação é quase um livro.
> Você leu esta parte dos docs:
>
> http://docs.python.org/library/logging.html#logger-objects
>
> Tem por exemplo este método:
>
> """
> Logger.findCaller()
> Finds the caller’s source filename and line number. Returns the
> filename, line number and function name as a 3-element tuple.
> """
>
> Tem certeza que o que vc quer fazer já não foi feito?


--
Leonardo Santagada

Henr"Ikke" Pereira

unread,
Mar 14, 2011, 3:00:42 PM3/14/11
to python...@yahoogrupos.com.br
2011/3/14 Luciano Ramalho <ram...@gmail.com>

> 2011/3/12 Mario Augusto Mania <mario...@gmail.com>:
> > Bem, seguinte, quanto ao logging, eu jah conhecia e usava :) É bacana,
> > porem, eu preciso especificar os niveis manualmente. Na caso, eu gostaria
> > que o metodo LOG fizesse a introspecção e determinasse dentro de qual
> > programa e dentro de qual metodo ele estava sendo chamado.
>
> Ok, mas o módulo logging faz o diabo, a documentação é quase um livro.
> Você leu esta parte dos docs:
>
> http://docs.python.org/library/logging.html#logger-objects
>
> Tem por exemplo este método:
>
> """
> Logger.findCaller()
> Finds the caller’s source filename and line number. Returns the
> filename, line number and function name as a 3-element tuple.
> """
>
> Tem certeza que o que vc quer fazer já não foi feito?
>
>

Essa discussão me lembrou de uma palestra da PyCon 2011 que eu assisti o
vídeo hoje de manhã, chamada Exhibition of Atrocity, disponível em
http://pycon.blip.tv/file/4881168/.

Específicamente um trecho que começa em 24:44 chamado Adventures in Wheel
Reinvention, onde o Mike Pirnat fala sobre a experiência na empresa deles
com as libs de logging e a conclusão que ele chegou.


--
Henr"Ikke" G.G. Pereira
http://www.halts.com.br
+55 (55) 9619-7499
|_|0|_|
|_|_|0|
|0|0|0|


> --
> Luciano Ramalho
> programador repentista || stand-up programmer
> Twitter: @luciano
>
>
> ------------------------------------
>
> Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
> Links do Yahoo! Grupos
>
>
>

[As partes desta mensagem que não continham texto foram removidas]

------------------------------------

Reply all
Reply to author
Forward
0 new messages