[Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado.

Jose Caballero jcaballero.hep en gmail.com
Mar Oct 29 16:54:51 CET 2013


Hola de nuevo,

acabo de probar tus sugerencias.

1.  using self.log() en lugar de self._log() parece funcionar bien

2.  usando la clase MyLogger()  funciona, siempre y cuando en el core
de la aplicacion no se llame nunca al logger root, que es el caso
actual.


Muchas gracias por todo,
Jose



El día 28 de octubre de 2013 22:41, Chema Cortes <pych3m4 en gmail.com> escribió:
> El día 28 de octubre de 2013 21:37, Jose Caballero
> <jcaballero.hep en gmail.com> escribió:
>> Hola,
>>
>>
>> quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE.
>> Siguiendo cierta informacion que encontre en  stackoverflow, lo que es
>> implementado es lo siguiente:
>>
>>
>>     logging.TRACE = 5
>>     logging.addLevelName(logging.TRACE, 'TRACE')
>>     def trace(self, msg, *args, **kwargs):
>>             self._log(logging.TRACE, msg, args, **kwargs)
>>     logging.Logger.trace = trace
>
>  _log envía el mensaje al logger sin chequear los niveles. Usa
> Logger.log en su lugar:
>
> def trace(self, msg, *args, **kwargs):
>        self.log(logging.TRACE, msg, *args, **kwargs)
>
> No veo clara la implementación que estás haciendo, con modificaciones
> tanto del módulo logging como de la clase Logger/RootLogger. Sin
> volver a la discursión de estos días sobre especializar o parchear
> clases, deberías derivar tu propia clase de Logger en vez de usar el
> logger root. Parcheando así podrías tener problemas con el
> multiproceso.
>
> import logging
>
> class MyLogger(logging.getLoggerClass()):
>
>     TRACE = 5
>     logging.addLevelName(TRACE, "TRACE")
>
>     def trace(self, msg, *args, **kwargs):
>         self.log(self.TRACE, msg, *args, **kwargs)
>
> logging.setLoggerClass(MyLogger)
>
> logger = logging.getLogger(__name__)
> logger.addHandler(logging.StreamHandler())
>
> logger.setLevel("TRACE")
> logger.trace("hi")
>
> logger.setLevel("INFO")
> logger.trace("hi")
>
>>
>>
>> y depues de eso ya hago lo normal
>>
>>     log = logging.getLogger()
>>     ....
>>
>>
>> El unico problema es que siempre ejecuta las llamadas a log.trace(),
>> independiente de el nivel de log. Por ejemplo, si hago   log.setLevel
>> ( "INFO" )  responde a todos los mensajes de niveles INFO, WARNING,
>> ERROR y CRITICAL, pero tambien TRACE.
>> Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no?
>>
>> Si alguien tiene una pista de porque no respeta el valor 5 y se
>> ejecuta siempre, cualquier comentario sera mas que bienvenido.
>>
>>
>> Muchas gracias por adelantado.
>> Jose
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>
>
>
> --
> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
> http://ch3m4.org/blog
> Buscador Python Hispano: http://ch3m4.org/python-es
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/


Más información sobre la lista de distribución Python-es