Я немного борюсь с регистрацией. Я бы хотел перевернуть журналы через определенный промежуток времени, а также после достижения определенного размера.
Повернитесь после периода времени TimedRotatingFileHandler
,
и опрокидывание после достижения определенного размера журнала производится RotatingFileHandler
.
Но TimedRotatingFileHandler
не имеет атрибута maxBytes
, а RotatingFileHandler
не может вращаться через определенный промежуток времени.
Я также попытался добавить обоих обработчиков в регистратор, но результат был удвоен для ведения журнала.
Я что-то пропустил?
Я также изучил исходный код logging.handlers
. Я попытался подклассом TimedRotatingFileHandler
и переопределить метод shouldRollover()
, чтобы создать класс с возможностями обоих:
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 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
Но, как и этот журнал, создается одна резервная копия, и она перезаписывается. Похоже, я должен переопределить также метод doRollover()
, который не так прост.
Любая другая идея, как создать регистратор, который перекатывает файл через определенное время, а также после определенного размера?