[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