2008-12-03 15 views
6

Estoy tratando de implementar el controlador de registro de Python llamado TimedRotatingFileHandler.TimedRotatingFileHandler ¿Cambiar nombre de archivo?

Cuando se pasa a la medianoche, agrega el día actual en el formato: "AAAA-MM-DD".

LOGGING_MSG_FORMAT = '%(name)-14s > [%(levelname)s] [%(asctime)s] : %(message)s' 
LOGGING_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' 

logging.basicConfig(
      level=logging.DEBUG, 
      format=LOGGING_MSG_FORMAT, 
      datefmt=LOGGING_DATE_FORMAT 
      ) 
root_logger = logging.getLogger('') 
logger = logging.handlers.TimedRotatingFileHandler("C:\\logs\\Rotate_Test",'midnight',1) 
root_logger.addHandler(logger) 
while True: 
    daemon_logger = logging.getLogger('TEST') 
    daemon_logger.info("SDFKLDSKLFFJKLSDD") 
    time.sleep(60) 

El primer archivo de registro creado se llama simplemente "Rotate_Test", entonces una vez que se da la vuelta al día siguiente se cambia el nombre del archivo a: "Rotate_Test.YYYY-MM-DD" Donde AAAA-MM-DD es el día actual.

¿Cómo puedo modificar la forma en que altera el nombre del archivo? Busqué en Google y miré la API y encontré prácticamente nada.

Respuesta

23

"¿Cómo puedo cambiar la forma en que altera el nombre de archivo?"

Dado que no está documentado, elegí leer la fuente. Esto es lo que llegué a la conclusión de la lectura de la fuente de logging/handlers.py

handler = logging.handlers.TimedRotatingFileHandler("C:\\isis_ops\\logs\\Rotate_Test",'midnight',1) 
handler.suffix = "%Y-%m-%d" # or anything else that strftime will allow 
root_logger.addHandler(handler) 

El sufijo es la cadena de formato.

+0

que era muy útil , ¡gracias! – Nobilis

1

Gracias.

Miré la fuente.

No hay realmente una manera de cambiar su forma. Desde la manipulación del sufijo, solo se agrega al final del nombre del archivo. De esta forma, no hay manera de manipular el nombre completo del archivo, lo que esperaba es que puedas declarar una máscara de archivo, y cuando haga el "RollOver" creará un nuevo nombre de archivo basado en la máscara del archivo . Solo voy a volver a mi idea original, era simplemente matar a todo el subsistema de registro y reiniciarlo con el nuevo nombre de archivo cuando RollsOver.

Gracias Tho.

+1

¿Por qué no escribir su propio controlador? Eso parece bastante simple. No tiene que usar sus controladores.La API para un controlador es MUY simple (creo que es el método de 'emit'. –

+0

Eso no es una mala idea, eché un vistazo más profundo al código. Voy a dar una oportunidad. :) :) Gracias. – UberJumper

1

Solo una actualización, terminé yendo por un enfoque diferente.

La manera más fácil que encontré para modificar la salida del archivo, era simplemente usar un FileHandler, y luego, cuando es el momento de hacer una transferencia.

hago esto:

if(current_time > old_time): 
    for each in logging.getLogger('Debug').handlers: 
     each.stream = open("C:\\NewOutput", 'a') 

Esa es la esencia de la misma. Me costó mucho hurgar y mirar alrededor, pero modificar la secuencia es la forma más fácil de hacerlo.

:)

2

Hay otro enfoque a este problema: por ejemplo, lo que necesito para hacer girar los registros en una base diaria, sino que debe ser nombrado con un sufijo en el% m% d% formato Y ...

¡Así que escribí una remezcla TimedRotatingFileHandler!

try: 
    import codecs 
except ImportError: 
    codecs = None 
import logging.handlers 
import time 
import os 

class MyTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler): 
    def __init__(self,dir_log): 
    self.dir_log = dir_log 
    filename = self.dir_log+time.strftime("%m%d%Y")+".txt" #dir_log here MUST be with os.sep on the end 
    logging.handlers.TimedRotatingFileHandler.__init__(self,filename, when='midnight', interval=1, backupCount=0, encoding=None) 
    def doRollover(self): 
    """ 
    TimedRotatingFileHandler remix - rotates logs on daily basis, and filename of current logfile is time.strftime("%m%d%Y")+".txt" always 
    """ 
    self.stream.close() 
    # get the time that this sequence started at and make it a TimeTuple 
    t = self.rolloverAt - self.interval 
    timeTuple = time.localtime(t) 
    self.baseFilename = self.dir_log+time.strftime("%m%d%Y")+".txt" 
    if self.encoding: 
    self.stream = codecs.open(self.baseFilename, 'w', self.encoding) 
    else: 
    self.stream = open(self.baseFilename, 'w') 
    self.rolloverAt = self.rolloverAt + self.interval 
1

Puede hacer esto cambiando el sufijo registro como se sugirió anteriormente, sino que también tendrá que cambiar la variable extMatch para que coincida con el sufijo para que encuentre los archivos rotados:

handler.suffix = "%Y%m%d" 
handler.extMatch = re.compile(r"^\d{8}$") 
Cuestiones relacionadas