2012-09-18 13 views
6

Si hay sentencias de registro distribuidas en una base de código, ¿cómo configuro el registrador para no tener que comentar cada llamada al registrador cuando despliegue el código en producción?Cómo desactivar las instrucciones de registro sin eliminarlas del código

Aquí está mi código actual:

import logging 


logging.basicConfig(filename='./example.log', level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d %H:%M') 

logging.debug('debug failed') 
logging.info('info failed') 
logging.warning('A warning') 
+1

¿No es este registro básico 101? – delnan

+2

@delman: si es 101, por favor, escriba una respuesta de práctica recomendada – Merlin

+0

No estoy calificado para eso, estoy seguro de que la forma obvia de hacerlo, configurar el filtrado para rechazar todos los mensajes, se describe en cualquier registro decente tutorial. – delnan

Respuesta

1

hay niveles de tala. En función de la gravedad del nivel de registro, lo imprimirá.

Level Numeric value 
CRITICAL 50 
ERROR 40 
WARNING  30 
INFO 20 
DEBUG 10 
NOTSET 0 

Según el nivel de registro, imprimirá las instrucciones.

el nivel que ha especificado aquí es level = logging.DEBUG. Entonces todos los niveles de registro, excepto los notset, deberían imprimirse. Si usted quiere imprimir sólo los niveles críticos, por favor cambie el nivel = logging.CRITICAL

http://docs.python.org/release/2.5/lib/module-logging.html tiene más información

3

lugar de utilizar el basicConfig, puede configurar el registrador de manera más explícita con los controladores que desea basado en cualquier criterio

import logging 

log = logging.getLogger("FOO") 
log.setLevel(logging.DEBUG) 

# needs a handler 
log.info('info') 
#No handlers could be found for logger "FOO" 

ch = logging.StreamHandler() 
log.addHandler(ch) 
log.info('info') 
# info 

log.removeHandler(ch) 

noop = logging.NullHandler() 
log.addHandler(noop) 
# nothing happens here 
log.info('info') 

Usted puede tener una sentencia condicional que, o bien añade el manejador que desea si está ejecutando en modo de depuración, o puede agregar un NullHandler que simplemente absorbe los mensajes de registro. También puede configurar los niveles individualmente de cada controlador, para que siempre vea las advertencias y más. Cada controlador puede tener su propio nivel, además del registrador principal.

Puede obtener información más detallada sobre niveles, manipuladores y formateos en refer to the tutorials.

+0

Veo su punto, la verdadera pregunta: puede configurar filtro para advertencia, y tener advertencia entrar en un agujero negro.Cuando sea necesario, volcar a un archivo quizás esté jugando con NullHandler. – Merlin

+0

Al jugar con basicConfig y establecer el nivel en '99', pareció funcionar. archivo creado, no imprimir en consola o archivo. – Merlin

+0

Puede agregar diferentes controladores basados ​​en indicadores en el script. Si lo ejecuta con un indicador de depuración podría hacer que agregue un manejador de archivos. De lo contrario, agrega un controlador nulo. Y puedes agregar múltiples controladores. Tal vez un conjunto de alertas de StreamHandler siempre imprime advertencias o más, y luego el controlador de archivos opcional está configurado para depurar para detectar todos sus niveles de depuración. Establecer el nivel en 99 solo lo hace tan alto que ningún nivel de registro lo igualará. No es realmente una forma común. – jdi

1

Aquí hay un par de respuestas realmente simples. El primero es simplemente comentar la declaración basicConfig(...). Eso tendrá el efecto de no configurar ninguno de los registradores, manejadores o formateadores, lo que significa que sus llamadas a debug(), info(), etc. serán efectivamente no operativas.

Otra respuesta simple es establecer el nivel de registro en la llamada basicConfig() a algo más alto que DEBUG. CRITICAL + 1 se aseguraría de que nunca vea un mensaje de registro.

Sin embargo, usted mencionó algo sobre cómo mover este código a producción, entonces lo que probablemente quiera hacer es proporcionar las opciones de línea de comando -q y -v (asumiendo que esta es una herramienta CLI). Mi enfoque habitual es comenzar en el nivel WARNING, y para cada -q avanzar hacia un registro más silencioso al aumentar el nivel del filtro. Por el contrario, para cada -v, avance hacia un registro más detallado. Aquí hay un fragmento de código que hace exactamente eso.

from argparse import ArgumentParser 
from logging import basicConfig, CRITICAL, ERROR, WARNING, INFO, DEBUG 

parser = ArgumentParser() 
parser.add_argument("-v", "--verbose", action="count") 
parser.add_argument("-q", "--quiet", action="count") 

arguments = parser.parse_args() 

raw_log_level = 2 + (arguments.verbose or 0) - (arguments.quiet or 0) 
if raw_log_level <= 0: 
    log_level = CRITICAL 
elif raw_log_level == 1: 
    log_level = ERROR 
elif raw_log_level == 2:  # default 
    log_level = WARNING 
elif raw_log_level == 3: 
    log_level = INFO 
else:   
    log_level = DEBUG 

basicConfig(level=log_level) 
Cuestiones relacionadas