values - python logging multiple files
Registro de Python: deshabilite el registro de módulos importados (5)
Estoy usando el módulo de registro de Python y me gustaría deshabilitar los mensajes de registro impresos por los módulos de terceros que importo. Por ejemplo, estoy usando algo como lo siguiente:
logger = logging.getLogger()
logger.setLevel(level=logging.DEBUG)
fh = logging.StreamHandler()
fh_formatter = logging.Formatter(''%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s'')
fh.setFormatter(fh_formatter)
logger.addHandler(fh)
Esto imprime mis mensajes de depuración cuando hago un logger.debug ("¡mi mensaje!"), Pero también imprime los mensajes de depuración de cualquier módulo que yo importe (como solicitudes y muchas otras cosas).
Me gustaría ver solo los mensajes de registro de los módulos que me interesan. ¿Es posible hacer que el módulo de registro haga esto?
Idealmente, me gustaría poder decirle al registrador que imprima mensajes de "ModuleX, ModuleY" e ignore todos los demás.
Observé lo siguiente, pero no quiero tener que deshabilitar / habilitar el registro antes de cada llamada a una función importada: registro: ¿cómo ignorar los registros de módulos importados?
@Bakuriu explica muy elegantemente la función. A la inversa, puede usar el método getLogger()
para recuperar y reconfigurar / deshabilitar los registradores no deseados.
También quería agregar el método logging.fileConfig()
acepta un parámetro llamado disable_existing_loggers
que deshabilitará cualquier registrador previamente definido (es decir, en módulos importados).
El problema es que llamar a getLogger
sin argumentos devuelve el registrador raíz, de modo que cuando configura el nivel en logging.DEBUG
, también está configurando el nivel para otros módulos que usan ese registrador.
Puede resolver esto simplemente no utilizando el registrador raíz. Para hacer esto, simplemente pase un nombre como argumento, por ejemplo, el nombre de su módulo:
logger = logging.getLogger(''my_module_name'')
# as before
esto creará un nuevo registrador y, por lo tanto, no cambiará inadvertidamente el nivel de registro para otros módulos.
Obviamente, tiene que usar logger.debug
lugar de logging.debug
ya que esta última es una función de conveniencia que llama al método de debug
del registrador raíz.
Esto se menciona en el tutorial de registro avanzado . También le permite saber qué módulo activó el mensaje de registro de una manera sencilla.
Esto deshabilita todos los registradores existentes, como los creados por módulos importados, mientras se sigue utilizando el registrador raíz (y sin tener que cargar un archivo externo).
logging.config.dictConfig({
''version'': 1,
''disable_existing_loggers'': True,
})
¡Tenga en cuenta que necesita importar todos los módulos que no desea que se registren primero! De lo contrario, esos no serán considerados como "madereros existentes". Entonces deshabilitará todos los registradores de esos módulos. ¡Esto podría llevarlo a perder también errores importantes!
Para obtener ejemplos más detallados que usan las opciones relacionadas para la configuración, consulte https://gist.github.com/st4lk/6287746 , y https://gist.github.com/st4lk/6287746 hay un ejemplo (parcialmente funcional) que usa YAML para la configuración con la biblioteca coloredlog
.
No estoy seguro de si esto es apropiado para publicar, pero estuve atascado por mucho tiempo y quería ayudar a alguien con el mismo problema, ¡como no lo había encontrado en ningún otro lugar!
Recibí registros de depuración de matplotlib a pesar de seguir la documentación bastante sencilla en https://docs.python.org/3.5/howto/logging.html#logging-advanced-tutorial y https://matplotlib.org/faq/troubleshooting_faq.html . Estaba iniciando mi registrador en main () de un archivo e importando una función para crear un gráfico desde otro archivo (donde había importado matplotlib).
Lo que funcionó para mí fue establecer el nivel de matplotlib antes de importarlo, en lugar de hacerlo como lo había hecho con otros módulos en mi archivo principal. Esto me pareció contrario a la intuición, por lo que si alguien tiene una idea de cómo puede configurar la configuración de un registrador que no se ha importado, me gustaría saber cómo funciona esto. ¡Gracias!
en mi archivo principal:
import logging
import requests
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logging.getLogger(''requests'').setLevel(logger.DEBUG)
def main():
...
en mi archivo plot.py:
import logging
logging.getLogger(''matplotlib'').setLevel(logging.WARNING)
import matplotlib.pyplot as plt
def generatePlot():
...
Si va a utilizar el paquete de logging
Python, es una convención común definir un registrador en cada módulo que lo use.
logger = logging.getLogger(__name__)
Muchos paquetes populares de python hacen esto, incluidas las requests
. Si un paquete usa esta convención, es fácil habilitar / deshabilitar el registro, ya que el nombre del registrador tendrá el mismo nombre que el paquete (o será un hijo de ese registrador). Incluso puede iniciar sesión en el mismo archivo que sus otros registradores.
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
requests_logger = logging.getLogger(''requests'')
requests_logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
requests_logger.addHandler(handler)