write values multiple logger log files example disable_existing_loggers python logging

values - El registro de Python antes de ejecutar logging.basicConfig?



python logging multiple files (4)

Esta es la única pieza del rompecabezas que las respuestas anteriores no mencionaron ... y todo tendrá sentido: el registrador "raíz", que se usa si llamas, digamos, a logging.info () antes de iniciar sesión. basicConfig (level = logging.DEBUG) - tiene un nivel de registro predeterminado de ADVERTENCIA .

Es por eso que logging.info () y logging.debug () no hacen nada: porque los has configurado no , por ... um ... no configurándolos.

Posiblemente relacionado (este me mordió): cuando NO llamaba a basicConfig, no parecía obtener mis mensajes de depuración, aunque configuré mis manejadores al nivel de DEPURACIÓN. Después de tirar un poco del pelo, descubrí que debes establecer el nivel del registrador personalizado para que también sea DEPURADOR. Si su registrador está configurado en ADVERTENCIA, configurar un controlador para DEPURAR (solo) no obtendrá ningún resultado en logger.info () y logger.debug ().

Parece que si invoca a logging.info () ANTES de ejecutar logging.basicConfig, la llamada logging.basicConfig no tiene ningún efecto. De hecho, no se registra.

¿Dónde está documentado este comportamiento? Realmente no entiendo


Esta respuesta de Carlos A. Ibarra es, en principio, correcta, sin embargo, es posible que la implementación se rompa, ya que está iterando sobre una lista que podría modificarse al llamar a removeHandler (). Esto no es seguro. Dos alternativas son:

while len(logging.root.handlers) > 0: logging.root.removeHandler(logging.root.handlers[-1]) logging.basicConfig(format=''%(asctime)s %(message)s'',level=logging.DEBUG)

o:

logging.root.handlers = [] logging.basicConfig(format=''%(asctime)s %(message)s'',level=logging.DEBUG)

donde el primero de estos dos que usa el bucle es el más seguro (ya que cualquier código de destrucción para el manejador se puede llamar explícitamente dentro del marco de registro). Aún así, este es un truco, ya que dependemos de logging.root.handlers para ser una lista.


Puede eliminar los controladores predeterminados y volver a configurar el registro de esta manera:

# if someone tried to log something before basicConfig is called, Python creates a default handler that # goes to the console and will ignore further basicConfig calls. Remove the handler if there is one. root = logging.getLogger() if root.handlers: for handler in root.handlers: root.removeHandler(handler) logging.basicConfig(format=''%(asctime)s %(message)s'',level=logging.DEBUG)


Sí.

Has pedido registrar algo. El registro debe, por lo tanto, fabricar una configuración predeterminada. Una vez que se configura el registro ... bueno ... está configurado.

"Con el objeto logger configurado, los siguientes métodos crean mensajes de registro:"

Además, puede leer sobre la creación de controladores para evitar el registro espurio. Pero eso es más un truco para la mala implementación que una técnica útil.

Hay un truco para esto.

  1. Ningún módulo puede hacer nada excepto las solicitudes logging.getlogger() a nivel global.

  2. Solo el if __name__ == "__main__": puede hacer una configuración de registro.

Si realiza el registro a nivel global en un módulo, puede forzar el registro para que fabrique su configuración predeterminada.

No hagas logging.info globalmente en ningún módulo. Si cree que debe tener logging.info a nivel global en un módulo, entonces debe configurar el registro antes de realizar importaciones. Esto lleva a secuencias de comandos de aspecto desagradable.