Hoy estaba pensando en un proyecto de Python que escribí hace un año donde usé logging
bastante extensamente. Recuerdo haber tenido que comentar un montón de llamadas de registro en escenarios de bucle interno (el código del 90%) debido a la sobrecarga (hotshot
indicó que era uno de mis principales cuellos de botella).¿Cómo puedo quitar las llamadas de registro de Python sin comentarlas?
Me pregunto ahora si hay alguna forma canónica de eliminar programáticamente las llamadas de registro en las aplicaciones de Python sin comentar ni descomentar todo el tiempo. Creo que podría usar la inspección/recompilación o la manipulación de código byte para hacer algo como esto y solo apuntar a los objetos de código que están causando los cuellos de botella. De esta manera, se podría añadir un manipulador como un paso posterior a la recopilación y el uso de un archivo de configuración centralizada, así:
[Leave ERROR and above]
my_module.SomeClass.method_with_lots_of_warn_calls
[Leave WARN and above]
my_module.SomeOtherClass.method_with_lots_of_info_calls
[Leave INFO and above]
my_module.SomeWeirdClass.method_with_lots_of_debug_calls
Por supuesto, te gustaría usarlo con moderación y, probablemente, con granularidad por función - solo para objetos de código que han mostrado logging
como un cuello de botella. Alguien sabe de algo como esto?
Nota: Hay algunas cosas que hacen que esto sea más difícil de realizar de manera efectiva debido a la escritura dinámica y el enlace tardío. Por ejemplo, cualquier llamada a un método llamado debug
puede tener que ser envuelto con un if not isinstance(log, Logger)
. En cualquier caso, supongo que todos los detalles menores se pueden superar, ya sea por acuerdo de caballeros o por alguna verificación en tiempo de ejecución. :-)
¿utiliza el mismo registrador de nivel de raíz? es decir, logging.getLogger()? Si es así, debes arreglarlo primero. De lo contrario, proporcione algunas de las llamadas de getLogger en esos módulos. –
@ S.Lott: utilizo LOG = logging.getLogger (__ name__) por módulo, luego llamo LOG.debug (msg) y similares. Aunque realmente no veo cómo es relevante. – cdleary