El día 29 de octubre de 2013 16:54, Jose Caballero
<jcaballero....@gmail.com> escribió:
> 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.

No veo cuál es el problema. El root logger estándar no tiene método
'trace' y ponerle uno te va a dar problemas de uso en multihilo. ¿No
sería mejor que quien quiera usar trace lo haga con instancias de tu
clase TraceLogger?

Igual te sería más práctico usar una "currificación" y dejar el root
logger sin tocar:

  logging.trace = functools.partial(logging.log, logging.TRACE)


>
>
> Muchas gracias por todo,
> Jose
>
>
>
> El día 28 de octubre de 2013 22:41, Chema Cortes <pych...@gmail.com> escribió:
>> 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/



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

Responder a