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 <pych...@gmail.com> wrote: > El día 28 de octubre de 2013 21:37, Jose Caballero > <jcaballero....@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@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@python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ _______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/