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

Chema Cortes pych3m4 en gmail.com
Mar Oct 29 12:38:55 CET 2013


El día 29 de octubre de 2013 10:26, Jose Caballero
<jcaballero.hep en gmail.com> escribió:
> 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.

Prueba.

"Multiple calls to getLogger() with the same name will always return a
reference to the same Logger object." Se puede decir que los loggers
funcionan como singletons siempre que los instancies desde getLogger.

LLamando a setLoggerClass() al inicio, todas las instancias de Logger
que se creen a partir de entonces llevarán el método trace. Así mismo,
ésta la razón por la que hay que usar getLoggerClass() para obtener la
clase a especializar (tal como hace mi código).


>
> 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/
> _______________________________________________
> 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


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