write values setlevel logger log info example disable_existing_loggers python logging

setlevel - python logging level values



logging setLevel, cómo funciona (3)

En la documentación de cómo hacerlo, hay un ejemplo:

import logging # create logger logger = logging.getLogger(''simple_example'') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create formatter formatter = logging.Formatter(''%(asctime)s - %(name)s - %(levelname)s - %(message)s'') # add formatter to ch ch.setFormatter(formatter) # add ch to logger logger.addHandler(ch)

¿Por qué debería establecer el nivel de logging.DEBUG dos veces, para Logger y para StreamHandler ?

Entiendo que ch.setLevel(logging.DEBUG) establecerá el nivel de depuración para el controlador de flujo. ¿Pero cuál es el efecto de establecer el nivel en el registrador? Donde se refleja este nivel?

Obtengo la misma salida de consola si cambio el nivel, por ejemplo, INFO al Logger o al StreamHandler .

Es decir:

........... logger.setLevel(logging.INFO) ............ ch.setLevel(logging.DEBUG)

da el mismo resultado en la consola que

........... logger.setLevel(logging.DEBUG) ............ ch.setLevel(logging.INFO)


Creo que es útil considerar estos tres puntos principales para comprender cómo funciona el registro:

  • Puede construir una jerarquía de objetos Logger. Cada uno de ellos inicialmente no tendrá ningún nivel establecido (nivel NOTSET). El nivel efectivo de un objeto Logger es el primer nivel que se ha establecido en la jerarquía en el camino hasta el registrador raíz (posiblemente NOTSET, si no se ha establecido ningún nivel).

  • El nivel efectivo de un registrador solo se usa para determinar si se debe iniciar una acción con un mensaje emitido directamente a ese registrador.

  • Esa acción es, primero, pasar el mensaje a los manejadores del Registrador, y segundo (dependiendo del valor del indicador de propagación ), pasarlo a cada uno de los manejadores de la cadena de antepasados ​​hasta la parte superior, sin tomar en consideración los niveles reales de cada uno de los madereros en la cadena.

Para responder a su pregunta, no necesita configurarla dos veces en ese ejemplo. Configurarlo en DEPURAR solo en el Registrador será suficiente para permitir que los mensajes de registro enviados directamente a su instancia de Logger lleguen a la consola (ya que el nivel predeterminado en un nuevo StreamHandler es NOTSET por defecto, por lo que permitirá que todo pase).


Está ahí para un ajuste fino (puede tener múltiples manejadores, y cada uno puede tener diferentes niveles establecidos) - con seguridad no puede establecer el nivel en el controlador, lo que provocará que procese todos los mensajes (también conocido como nivel NOTSET) y deje el filtrado de nivel al registrador.

Logger también es el primero en filtrar el mensaje según un nivel: si configura el registrador en INFO y todos los manejadores en DEBUG, aún no recibirá los mensajes DEBUG en los manejadores, serán rechazados por el propio registrador. Si configura el registrador en DEBUG, pero todos los manejadores en INFO, tampoco recibirá ningún mensaje DEBUG porque, mientras el registrador dice "ok, procesa esto", los manejadores lo rechazan (DEBUG <INFO).


Por qué debería establecer el nivel de logging.DEBUG dos veces, para el registrador y para el manejador de flujos. Entiendo que ch.setLevel (logging.DEBUG) establecerá el nivel de depuración para el controlador de flujo. ¿Pero cuál es el efecto de establecer el nivel en el registrador ?. ¿Dónde se refleja este nivel?

Esto se indica en la documentación:

"El método setLevel (), al igual que en los objetos logger, especifica la gravedad más baja que se enviará al destino apropiado. ¿Por qué hay dos métodos setLevel ()? El nivel establecido en el registrador determina qué gravedad de los mensajes pasará a sus controladores. El nivel establecido en cada controlador determina qué mensajes enviará ese controlador. "

Compruebe en Manejadores: http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial