2011-03-14 12 views
16

estoy usando el siguiente código para inicializar el registro en mi solicitud:Reiniciar el registro en un archivo nuevo (Python)

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 

# log to a file 
directory = '/reserved/DYPE/logfiles' 
now = datetime.now().strftime("%Y%m%d_%H%M%S") 
filename = os.path.join(directory, 'dype_%s.log' % now) 
file_handler = logging.FileHandler(filename) 
file_handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter("%(asctime)s %(filename)s, %(lineno)d, %(funcName)s: %(message)s") 
file_handler.setFormatter(formatter) 
logger.addHandler(file_handler) 

# log to the console 
console_handler = logging.StreamHandler() 
level = logging.INFO 
console_handler.setLevel(level) 
logger.addHandler(console_handler) 

logging.debug('logging initialized') 

¿Cómo puedo cerrar el archivo de registro actual y reiniciar el registro en un archivo nuevo?

Nota: No quiero utilizar RotatingFileHandler, porque quiero un control total sobre todos los nombres de archivo.

Respuesta

23

Puede volver a asignar manualmente el controlador si desea utilizando el removeHandler y addHandler O, puede acceder a logger.handlers[index_of_handler_here].stream y reemplazar manualmente la corriente, pero recomiendo la primera sobre la segunda.

logger.handlers[0].stream.close() 
logger.removeHandler(logger.handlers[0]) 

file_handler = logging.FileHandler(filename) 
file_handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter("%(asctime)s %(filename)s, %(lineno)d, %(funcName)s: %(message)s") 
file_handler.setFormatter(formatter) 
logger.addHandler(file_handler) 
+1

Por lo tanto, puede utilizar esta ?: logger.removeHandler (logger.handlers [0]) – compie

+1

@Compie, Sí, que lo harán. Es posible que desee 'logger.handlers [0] .stream.close()' primero. –

+0

Y no cierre stdout o stderr si tiene un StreamHandler() – SoloPilot

0

Aquí es lo que hago:

def initLogging(filename): 
    global logger 
    if logger == None: 
     logger = logging.getLogger() 
    else: # wish there was a logger.close() 
     for handler in logger.handlers[:]: # make a copy of the list 
      logger.removeHandler(handler) 

    logger.setLevel(logging.DEBUG) 
    formatter = logging.Formatter(fmt='%(asctime)s: %(message)s', datefmt='%I:%M:%S') 

    fh = logging.FileHandler(filename) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 

    sh = logging.StreamHandler(sys.stdout) 
    sh.setFormatter(formatter) 
    logger.addHandler(sh) 
+0

¿Es necesaria la instrucción if y la variable global? logging.getLogger() siempre devolverá la misma instancia (obteniendo efectivamente el valor de la variable global para usted) – MD004

Cuestiones relacionadas