2012-02-02 17 views
18

Tengo un programa python que está escribiendo en un archivo de registro que está siendo rotado por el comando logrotate de Linux. Cuando esto sucede, necesito indicarle a mi programa que deje de escribir en el archivo anterior y empiece a escribir en el nuevo. Puedo manejar la señal, pero ¿cómo le digo a Python que escriba en el nuevo archivo?Registro de Python y archivos rotativos

estoy abriendo el archivo de la siguiente manera:

logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO) 

y escribir en él como esto:

logging.log(level,"%s" % (msg)) 

Los módulos de registro parecen muy potente, pero también abrumadora. Gracias.

Respuesta

14

Es posible que desee ver en WatchedFileHandler para implementar esto, o como alternativa, poner en práctica la rotación de registros con RotatingFileHandler, ambos de los cuales están en la logging.handlers module.

+0

Gracias! Si lo necesito, puedo seguir esta ruta, pero actualmente el archivo ya se está girando fuera de mi código. Esperaba que hubiera una forma de cerrar el registro y volver a abrirlo. – fredsnertz

+0

Ah ... WatchedFileHandler ... ahora lo entiendo. – fredsnertz

4
from logging import handlers 

handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE) 

handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S")) 

#LOG_ROTATE = midnight  
#set your log format 

Esto debería ayudar en el manejo de registro de rotación

7

Desde la rotación ya se está haciendo por logrotate, en su manejador de señales que sólo debe llamar logging.basicConfig(...) de nuevo y que debe volver a abrir el archivo de registro.

13

No utilice logging.basicConfig, use WatchedFileHandler. He aquí cómo usarlo.

import time 
import logging 
import logging.handlers 

def log_setup(): 
    log_handler = logging.handlers.WatchedFileHandler('my.log') 
    formatter = logging.Formatter(
     '%(asctime)s program_name [%(process)d]: %(message)s', 
     '%b %d %H:%M:%S') 
    formatter.converter = time.gmtime # if you want UTC time 
    log_handler.setFormatter(formatter) 
    logger = logging.getLogger() 
    logger.addHandler(log_handler) 
    logger.setLevel(logging.DEBUG) 

log_setup() 
logging.info('Hello, World!') 
import os 
os.rename('my.log', 'my.log-old') 
logging.info('Hello, New World!') 
+0

¡Gracias por el ejemplo! Muy similar a lo que estaba tratando de hacer :) – houcros

+0

Tenga en cuenta que según los documentos esto solo funciona en * nix. –

Cuestiones relacionadas