2011-07-07 7 views
30

En el logging howto documentation existe este ejemplo:tala setLevel, cómo funciona

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 el StreamHandler?

Entiendo 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 a, por ejemplo, INFO al Logger o al StreamHandler.

Es decir:

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

da la misma salida en la consola de

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

Respuesta

34

Es allí para ajuste fino (puede tener varios controladores, y cada uno puede tener diferentes niveles establecidos) - no puede establecer con seguridad el nivel en el controlador, lo que hará que procese todos los mensajes (también conocido como nivel NOTSET) y dejará el nivel de filtrado en el registrador.

Logger es también el primero en filtrar el mensaje basado en un nivel: si configura el registrador en INFO y todos los controladores en DEPURAR, aún no recibirá mensajes DEBUG en los manejadores, serán rechazados por el registrador en sí. Si establece registrador de depurar, pero todos los que manejan a la información, usted no recibirá ningún mensajes de depuración, ya sea - porque mientras el registrador dice "ok, este proceso", los manipuladores de la rechazan (DEBUG < INFO).

2

Creo que es útil tener en cuenta estos tres puntos principales para entender cómo funciona el registro:

  • Se puede construir una jerarquía de objetos Logger. Cada uno de ellos tendrá inicialmente sin ningún nivel establecido (nivel NOTSET). El nivel efectivo de un objeto Logger es el primer nivel que ha han establecido en la jerarquía en el camino hasta el registrador raíz (posiblemente NotSet, si hay un nivel ha sido conjunto).

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

  • que la acción es, primero, pasando el mensaje a que manejadores de Logger, y segundo (dependiendo del valor de la propagar bandera), pasándole a cada uno de los controladores de la cadena de antepasados ​​para la parte superior, sin tener en cuenta los niveles reales de cada uno de los registradores 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).

3

¿Por qué debería establecer el nivel de registro de DOS BUG dos veces, para el registrador y para el controlador de flujo. 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 del registrador, especifica la gravedad más bajo que será enviado al destino apropiado ¿Por qué hay dos setLevel() Métodos: el nivel establecido en el registrador determina qué gravedad de los mensajes pasará a sus manejadores. El nivel establecido en cada manejador determina qué mensajes enviará ese manejador.

Ver a través de los manipuladores: http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial