2012-03-25 24 views
9

El módulo de registro de Python permite que los módulos o clases definan sus propios registradores. Y diferentes madereros pueden tener diferentes controladores. Algunos de ellos pueden optar por iniciar sesión en un archivo, mientras que otros eligen iniciar sesión, digamos, stdout.Cómo configurar todos los registradores en una aplicación

Ahora mi aplicación utiliza varios de estos módulos, cada uno con sus propios registradores que tienen varios controladores. ¿Puedo unificar el comportamiento de registro para que todos los registros vayan a un archivo de registro que especifiqué? En otras palabras, ¿hay alguna manera de .config() manejar todos los manejadores de registros a la vez, desde un solo lugar?

Respuesta

10

Probablemente deberías consultar el Python Logging HOWTO para entender cómo funciona.

En resumen, todos los módulos suelen hacer es obtener un registrador de la forma G_LOG = logging.getLogger('package.name') y enviar mensajes al registrador: G_LOG.info('some message'), G_LOG.exception('something bad happened'). Los módulos generalmente no deberían configurar nada.

La aplicación que utiliza los módulos se puede convertir el registro y configurar los controladores de la base de los nombres del registrador:

  • escuchar todos los mensajes o
  • sólo escuchan mensajes por encima de un cierto umbral, o
  • escuchar mensajes sólo de los registradores de cuyo nombre empieza por package o
  • escuchar mensajes sólo de los registradores de cuyo nombre empieza valió la pena package.name, etc

La forma más sencilla es configurar el registro a través logging.basicConfig en algún lugar en el comienzo de su aplicación:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(levelname)-8s %(message)s', 
        datefmt='%Y-%m-%d %H:%M:%S', 
        filename=log_file, filemode='a') 

De esa manera usted va a escribir todos los mensajes de registro de todos los módulos a la log_file.

Si necesita una estrategia de registro más detallada (colocar registros de diferentes registradores en diferentes archivos o enviar stacktraces a un archivo separado), es mejor definir un archivo de configuración de registro y configurar el registro utilizando logging.config.dictConfig o logging.config.fileConfig.

P.S. Por lo general crear dos registradores como variables de módulo:

G_LOG = logging.getLogger(__name__) 
ST_LOG = logging.getLogger('stacktrace.' + __name__) 

a G_LOG que enviar sólo mensajes de una sola línea. Para ST_LOG Duplico mensajes importantes usando ST_LOG.exception que implícitamente tiene exc_info=True y escribe el stacktrace de la excepción actual.

Al inicio de la aplicación me carga una configuración que configura dos registradores (y dos controladores de archivos para ellos): uno que recibe los mensajes que comienzan con stacktrace y tiene propagate=0 (es decir mensajes StackTrace no son visibles en la parte superior) y el registrador de raíz que maneja el resto de los mensajes. No pondré aquí mis archivos completos de configuración de registro, ya que es un trabajo doméstico útil para entender cómo funciona todo.

+1

Me encanta la idea de stacktrace que tiene aquí, pero odio su posición de "No voy a poner aquí mis archivos de configuración de registro completos". He estado haciendo el desarrollo de python durante casi 10 años y sigo registrando muy mal debido a lo terrible que es la documentación. Algunas veces al año invierto días enteros de trabajo para tratar de encontrar algo mejor. Normalmente me rindo y me conformaré con algo que hice en el pasado. –

+0

@BrunoBronosky, probablemente, tienes razón. Es una buena idea. – newtover

Cuestiones relacionadas