2010-01-08 20 views
6

He leído la documentación del módulo de registro y, aunque es posible que haya olvidado algo obvio, el código que tengo no parece funcionar según lo previsto. Estoy usando Python 2.6.4.Registro de Python en varios archivos

Mi programa consiste en varios archivos de python diferentes, desde los cuales deseo enviar mensajes de registro a un archivo de texto y, potencialmente, a la pantalla. Me imagino que esto es algo común de hacer, así que estoy arruinando esto en algún lado.

Lo que mi código está haciendo en este momento es iniciar sesión en el archivo de texto correctamente, un poco. Pero el registro en la pantalla se está duplicando, uno con el formato especificado y otro sin él. Además, cuando apago la salida de la pantalla, sigo obteniendo el texto impreso una vez, lo que no quiero, solo quiero que se registre en el archivo.

De todos modos, algo de código:

#logger.py 
import logging 
from logging.handlers import RotatingFileHandler 
import os 

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):   
    logdir = os.path.abspath(logdir) 

    if not os.path.exists(logdir): 
     os.mkdir(logdir) 

    log = logging.getLogger('stumbler') 
    log.setLevel(loglevel) 

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s") 

    if txtlog: 
     txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5) 
     txt_handler.doRollover() 
     txt_handler.setFormatter(log_formatter) 
     log.addHandler(txt_handler) 
     log.info("Logger initialised.") 

    if scrnlog: 
     console_handler = logging.StreamHandler() 
     console_handler.setFormatter(log_formatter) 
     log.addHandler(console_handler) 

Nada raro allí.

#core.py 
import logging 
corelog = logging.getLogger('stumbler.core') # From what I understand of the docs, this should work :/ 

class Stumbler: 
    [...] 

    corelog.debug("Messages and rainbows...") 

La salida de pantalla muestra cómo se está duplicada:

2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3 
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3 
2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe 
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe 

Aunque el archivo de texto está recibiendo la salida con formato correcto, girando el registro fuera de la pantalla en logger.py todavía tiene la salida con formato incorrecto que se muestra .

Por lo que entiendo de los documentos, al llamar a corelog.debug(), ya que corelog es un elemento secundario del registrador "stumbler", debe usar ese formato y generar los registros como tales.

Disculpas por el ensayo sobre un tema tan trivial.

TL; DR: ¿Cómo puedo iniciar sesión desde varios archivos?

Respuesta

12

¿Está seguro de que no se está realizando ninguna otra configuración de registro en ningún elemento que importe?

La salida incorrecta en los registros de la consola se ve como la configuración predeterminada para un registrador, por lo que algo más puede estar configurando eso.

La ejecución de este script de prueba rápida:

import logging 
from logging.handlers import RotatingFileHandler 
import os 

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG): 
    logdir = os.path.abspath(logdir) 

    if not os.path.exists(logdir): 
     os.mkdir(logdir) 

    log = logging.getLogger('stumbler') 
    log.setLevel(loglevel) 

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s") 

    if txtlog: 
     txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5) 
     txt_handler.doRollover() 
     txt_handler.setFormatter(log_formatter) 
     log.addHandler(txt_handler) 
     log.info("Logger initialised.") 

    if scrnlog: 
     console_handler = logging.StreamHandler() 
     console_handler.setFormatter(log_formatter) 
     log.addHandler(console_handler) 



setup_logging('/tmp/logs') 
corelog = logging.getLogger('stumbler.core') 
corelog.debug("Messages and rainbows...") 

produce este resultado:

2010-01-08 15: 39: 25,335 - debug :: mensajes y arco iris ...

y en mi /tmp/logs/Stumbler.log

2010-01-08 15: 39: 25,335 - INFO :: Logger initialised. 2010-01-08 15: 39: 25,335 - debug :: Mensajes y arco iris ...

Esto funcionó como se esperaba cuando me encontré con él en Python 2.4, 2.5, 2.6.4 y

+1

Wow , punto en. Tenía logging.basicConfig() aún en uso en algunos de mis otros módulos. NUNCA se me ocurrió que podrían estar causando los problemas. ¡Gracias! – Loix0