Peleo un poco con el registro. Me gustaría pasar los registros después de cierto período de tiempo y también después de alcanzar cierto tamaño.The logging.handlers: ¿Cómo reiniciar después del tiempo o maxBytes?
Rollover después de un período de tiempo se hace por TimedRotatingFileHandler
, y vuelco después de alcanzar cierto tamaño de registro se hace por RotatingFileHandler
.
Pero el TimedRotatingFileHandler
no tiene el atributo maxBytes
y la RotatingFileHandler
no puede girar después de un cierto período de tiempo. También traté de agregar ambos manejadores al registrador, pero el resultado fue el doble de registro.
¿Extraño algo?
También busqué en el código fuente de logging.handlers
. Traté de subclase TimedRotatingFileHandler
y reemplazar el método shouldRollover()
para crear una clase con capacidades de ambos:
class EnhancedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0, maxBytes=0):
""" This is just a combination of TimedRotatingFileHandler and RotatingFileHandler (adds maxBytes to TimedRotatingFileHandler) """
# super(self). #It's old style class, so super doesn't work.
logging.handlers.TimedRotatingFileHandler.__init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0)
self.maxBytes=maxBytes
def shouldRollover(self, record):
"""
Determine if rollover should occur.
Basically, see if the supplied record would cause the file to exceed
the size limit we have.
we are also comparing times
"""
if self.stream is None: # delay was set...
self.stream = self._open()
if self.maxBytes > 0: # are we rolling over?
msg = "%s\n" % self.format(record)
self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
if self.stream.tell() + len(msg) >= self.maxBytes:
return 1
t = int(time.time())
if t >= self.rolloverAt:
return 1
#print "No need to rollover: %d, %d" % (t, self.rolloverAt)
return 0
Pero como esto crea el registro de una copia de seguridad y el se sobreescribe. Parece que también tengo que anular el método doRollover()
que no es tan fácil.
¿Alguna otra idea de cómo crear un registrador que transfiere el archivo después de cierto tiempo y también después de alcanzar cierto tamaño?
Obviamente, no hay una respuesta directa, excepto sumergirse en el código de la biblioteca y descifrarlo.Afortunadamente, la biblioteca estándar generalmente está bien escrita e idiomática, por lo que si debe hacer esto, aprenderá. Sin embargo, le preguntaría esto a cualquiera que se acerque a mí con esta pregunta: ¿por qué quiere la función de tiempo o tamaño? ¿Qué estás intentando lograr? ¿Cuál es el caso de uso? Como el 'registro' es bastante completo, su deseo puede considerarse "atípico" o la instalación estaría allí. – msw