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
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
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 S. O. Bueno" <jsb...@python.org.br> escreveu:
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]
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
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@...>:
Muito interessante esta ideia de disparar excessoes e trata-las. Vou estudar
isso.
m3
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:
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
> 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]
------------------------------------