¿Por qué mi TimedRotatingFileHandler no gira a la medianoche?

Este es mi archivo de configuración:

[loggers] keys=root [handlers] keys=TimedRotatingFileHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=TimedRotatingFileHandler [handler_TimedRotatingFileHandler] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=simpleFormatter args=('driver.log', 'midnight', 1, 30) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt= 

En mi código configuro y uso el registrador de esta manera:

 import logging import logging.config logging.config.fileConfig('logging.conf') logging.info('Some message...') 

Los mensajes se registran en el archivo que especifico (driver.log), pero las rotaciones a la medianoche nunca suceden.

¿Debe ejecutarse el proceso a la medianoche para que se produzca la rotación? Este es un proceso por lotes que ejecuto cada 15 minutos y en realidad nunca se ejecuta a la medianoche.

La respuesta es que el proceso debe ejecutarse todo el tiempo para que esto funcione correctamente.

De http://bytes.com/topic/python/answers/595931-timedrotatingfilehandler-isnt-rotating-midnight :

La rotación debe ocurrir cuando el proceso de registro crea el controlador antes de la medianoche y realiza una llamada de registro destinada a ese controlador después de la medianoche.

Supongo que esto realmente solo sucede cuando el proceso se ejecuta a la medianoche. En su caso (el cronjob no se ejecuta durante mucho tiempo), debe ir con un archivo de registro simple, donde la fecha actual se agrega al nombre de archivo de registro. De esta manera, un “rollover” ocurre automáticamente.

También me he encontrado con este problema, por varias razones que no pude usar rotatelog y un cron para rotar los registros es simplemente agregar una cosa extra que podría salir mal. Utilicé la siguiente función para rotar los archivos, diariamente.

 import os import datetime import glob def sort_number_ext(s): try: return int(os.path.splitext(s)[1][1:]) except: return s def rotate_file(file, keep=30): """ Rotate a file if needed. If the file wasn't modified today then we rotate it around and remove old files """ modified_date = datetime.datetime.fromtimestamp(os.path.getmtime(file)) if modified_date.date() == datetime.datetime.today().date(): return False old_files = glob.glob(file + ".*") old_files.sort(key=sort_number_ext, reverse=True) for f in old_files: try: number = int(os.path.splitext(f)[1][1:]) except ValueError: continue if number >= keep: # If at or above keep limit, remove. os.unlink(f) else: # Increment. new = "%s.%s" % (os.path.splitext(f)[0], number + 1) os.rename(f, new) # Finally rename our log. os.rename(file, "%s.1" % file) return True 

Llamo a esto para rotar mis registros antes de inicializar el registrador.