2010-08-12 13 views
8

Tengo una función de inicialización tales registrador:pitón registro registrador misma entrada en numerosas ocasiones

def generate_logger(): 
    import logging 
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log") 
    FORMAT = "%(asctime)s : %(message)s" 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    fh = logging.FileHandler(LOG_FILENAME) 
    formatter = logging.Formatter(FORMAT) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 
    return logger 

Y en alguna parte de mi código que tienen tales excepción captura:

logger = generate_logger() 
except AttributeError: 
    logger.error('Opps we got an error') 

Extrañamente me sale el mismo error escrito 2 veces y puede ser caugh solo una vez, una vez que cambio logger.error('Opps we got an error') con print "test", obtengo una "prueba" impresa una vez.

¿Cuál puede ser el problema y la solución?

Saludos

Respuesta

9

Está agregando un nuevo FileHandler al registrador de raíz cada vez que llama a esa función: la llamada a logger.getLogger sin un argumento de nombre devuelve el mismo objeto de registrador cada vez.

Debe llamar generate_logger() sólo una vez y luego simplemente conseguir el mismo objeto registrador llamando Logger.getLogger():

generate_logger() 

# .... some time later 

log = logger.getLogger() 
except AttributeError: 
    log.error('Opps we got an error') 

(tenga en cuenta que no es necesario generate_logger() para devolver un valor ahora)

2

es probable que haya dos controladores que van a la misma de registro resultante.

¿Cuántos controladores están creando? ¿Cuántas veces está ejecutando generate_logger? Cada vez que ejecuta generate_logger, creará otro controlador en el mismo archivo, lo que generará posibles duplicaciones.

3

Creo que probablemente esté agregando dos manejadores al registrador de alguna manera. Quizás en algún momento se esté agregando un controlador implícito.

9

También me enfrenté al mismo problema y encontré esta página. Sí, también estaba creando múltiples controladores. En generate_logger(), puede verificar si hay otros controladores y eliminarlos.

def generate_logger(): 
    import logging 
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log") 
    FORMAT = "%(asctime)s : %(message)s" 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    # Reset the logger.handlers if it already exists. 
    if logger.handlers: 
     logger.handlers = [] 
    fh = logging.FileHandler(LOG_FILENAME) 
    formatter = logging.Formatter(FORMAT) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 
    return logger 
Cuestiones relacionadas