2012-06-27 30 views
26

Ya estoy usando una configuración de registro básica donde todos los mensajes en todos los módulos se almacenan en un solo archivo. Sin embargo, ahora necesito una solución más compleja:Registrando en dos archivos con configuraciones diferentes

  • Dos archivos: el primero sigue siendo el mismo.
  • El segundo archivo debe tener algún formato personalizado.

He estado leyendo los documentos para el módulo, pero son muy complejos para mí en este momento. Madereros, manipuladores ...

Así, en pocas palabras:

Cómo iniciar sesión en dos archivos en Python 3, es decir:

import logging 
# ... 
logging.file1.info('Write this to file 1') 
logging.file2.info('Write this to file 2') 

Respuesta

53

se puede hacer algo como esto:

import logging 
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 


def setup_logger(name, log_file, level=logging.INFO): 
    """Function setup as many loggers as you want""" 

    handler = logging.FileHandler(log_file)   
    handler.setFormatter(formatter) 

    logger = logging.getLogger(name) 
    logger.setLevel(level) 
    logger.addHandler(handler) 

    return logger 

# first file logger 
logger = setup_logger('first_logger', 'first_logfile.log') 
logger.info('This is just info message') 

# second file logger 
super_logger = setup_logger('second_logger', 'second_logfile.log') 
super_logger.error('This is an error message') 

def another_method(): 
    # using logger defined above also works here 
    logger.info('Inside method') 
+1

El nivel de registro predeterminado es 'logging.WARNING', por lo que sería más claro si se llama a' Logger.setLevel (logging.WARNING) '. – zeekvfu

+1

¿Por qué mi 'logger_1' no da salida al archivo de registro? He configurado 'logger_1.error ('error foo')', pero aún no funciona – Gank

+0

¿te importaría pegar tu código aquí? – eos87

8
def setup_logger(logger_name, log_file, level=logging.INFO): 
    l = logging.getLogger(logger_name) 
    formatter = logging.Formatter('%(message)s') 
    fileHandler = logging.FileHandler(log_file, mode='w') 
    fileHandler.setFormatter(formatter) 
    streamHandler = logging.StreamHandler() 
    streamHandler.setFormatter(formatter) 

    l.setLevel(level) 
    l.addHandler(fileHandler) 
    l.addHandler(streamHandler)  


setup_logger('log1', txtName+"txt") 
setup_logger('log2', txtName+"small.txt") 
logger_1 = logging.getLogger('log1') 
logger_2 = logging.getLogger('log2') 




logger_1.info('111messasage 1') 
logger_2.info('222ersaror foo') 
+0

¿Son globales logger_1 y logger_2? Es decir, ¿puedo usarlos dentro de cualquier función? si no, ¿es una buena idea hacerlos globales en la función principal def? si es así, ¿cómo lo harías? – Dnaiel

Cuestiones relacionadas