[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 10:26:29 CET 2013


Hola,

probaré a usar self.log() como sugieres.

La razón por la que lo hago en el logger root es porque la aplicación está compuesta por varios módulos y plugins, incluyendo los que los usuarios puedan escribir por su cuenta sin yo saberlo. Quiero que al hacer log = getLogger("foo") al comienzo de cada módulo y cada plugin, el objeto log contenga el método trace().
Tu sugerencia es correcta, pero si alguien olvida usar la clase ad-hoc MyLogger pierde la nueva funcionalidad. Creo. 
O tal vez es que aún no entiendo bien las clases de log. Probaré tu sugerencia en cualquier caso.

Muchas gracias por la respuesta y los comentarios.

Saludos,
Jose


On Oct 28, 2013, at 22:41, Chema Cortes <pych3m4 en gmail.com> wrote:

> 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