2011-11-25 18 views
10

Estoy usando el módulo de registro de Python en un script simple mío con la siguiente configuración en este momento.Registro de Python solo registro del script

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') 
logger = logging.getLogger(__name__) 

Mi problema es que esto también atrapa módulos de terceros como solicitudes y mensajes de información de salida() de ellos. ¿Hay alguna forma de suprimir estos mensajes o indicarle al módulo de registro que solo registre mensajes de mi propio script?

Respuesta

10

El uso de registradores nombrados en sus módulos:

import logging 
logger = logging.getLogger(__name__) 
logger.info("my info") 
logger.error("my error") 

puede establecer el nivel de registro para todos los otros registradores de error y para sus registradores de depurar:

import logging 
logging.basicConfig(level=logging.ERROR) 
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG) 
0

La respuesta anterior no es realmente correcto: solo aumentará la barra para que se muestren los mensajes de otros módulos.

Un enfoque muy rápido sería utilizar esta pieza de código:

import logging.config 
logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

Tienes que establecer esto después de la importación de todos los módulos - que se desactivan todos los registradores que se han creado hasta el momento. Esto funcionará la mayor parte del tiempo, pero algunos módulos crean su registrador cuando haces una instancia de clase por ejemplo (lo que sucedería más adelante en tu código).


Al configurar los registradores de acuerdo con el tutorial de Python básica que le dicen a utilizar logging.basicConfig(...). Esto es un problema ya que esto configurará el manejador (también conocido como en donde se enrutará el registro) a logging.lastResort que es stderr comenzando con Python 3.2 para todos los registradores globalmente en el proceso. Esto significa que ahora ha habilitado el registro completo para todos los módulos.

Así que un mejor enfoque es crear un registrador diferente solo para sus módulos y darle algunos controladores propios en lugar de usar basicConfig().

Hay dos maneras de hacerlo:

1) Todas las funciones:

import logging 

log = logging.getLogger(__name__) 
log.setLevel(logging.DEBUG) 
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
          datefmt="%Y-%m-%d - %H:%M:%S") 
ch = logging.StreamHandler(sys.stdout) 
ch.setLevel(logging.DEBUG) 
ch.setFormatter(formatter) 
fh = logging.FileHandler("mylog.log", "w") 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(formatter) 
log.addHandler(ch) 
log.addHandler(fh) 

esto le dará el registrador log que entonces se puede utilizar como log.error("Error found"). Escribirá en un nuevo archivo llamado mylog.log y también lo hará para sys.stdout. Puedes cambiar esto como quieras, por supuesto.

2) El uso de un diccionario:

import logging 
import logging.config 

DEFAULT_LOGGING = { 
    'version': 1, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s %(levelname)s: %(message)s', 
      'datefmt': '%Y-%m-%d - %H:%M:%S' }, 
    }, 
    'handlers': { 
     'console': {'class': 'logging.StreamHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'stream': sys.stdout}, 
     'file':  {'class': 'logging.FileHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'filename': 'live_detector.log','mode': 'w'} 
    }, 
    'loggers': { 
     __name__: {'level': 'INFO', 
        'handlers': ['console', 'file'], 
        'propagate': False }, 
    } 
} 

logging.config.dictConfig(DEFAULT_LOGGING) 
log = logging.getLogger(__name__) 

Esto le dará el mismo resultado que el anterior, un poco más de tiempo, pero tal vez más fácil de leer. Esto también establecerá automáticamente 'disable_existing_loggers': True. Si no quiere eso, debe agregarlo y configurarlo en False.