Python RotatingFileHandler, похоже, не вращает логи - PullRequest
0 голосов
/ 05 июня 2018

Я настроил регистратор со следующим кодом:

log = logging.getLogger('base')
logfilename =  <path to logfile>
logFile = logging.FileHandler(logfilename)
log.setLevel(debug)
logFile.setFormatter(logging.Formatter('[%(asctime)s]: [%(filename)s:%(lineno)d:%(funcName)s]: %(levelname)s :: %(message)s', datefmt='%m-%d-%Y %H:%M:%S'))
log.addHandler(logFile)

Поскольку файлы журнала были большими, я хотел создать вращающийся файл журнала.Поэтому я сделал следующее изменение:

# logFile = logging.FileHandler(logfilename)
logFile = RotatingFileHandler(logfilename, maxBytes=1024)  # maxBytes=1024 only for testing

Однако полученный файл журнала не поворачивается.Я все еще получаю журналы размером несколько МБ.Я очистил все файлы .pyc.

Вопросы:

  1. Нужно ли указывать количество резервных копий (мне нужно сохранить все журналы! Следовательно, если это обязательно, янужно указать какое-то безумно большое число).
  2. By maxBytes Я предполагаю, что это фактические байты (поэтому в моем случае журнал должен вращаться каждые 1 кБ) и больше ничего.Я прав?
  3. Существует ли минимальное число для maxBytes, ниже которого вращение неэффективно?(Полагаю, нет)

Я работаю с Python 2.7.14 (Анаконда) и 3.6.4 (Анаконда).

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вам необходимо установить значение backupCount, или , чтобы изменить режим файла с добавления на усечение при открытии.

Файл журнала закрыт , нозатем снова открывается для добавления , так что вы на самом деле никогда не видите разницы.

Что происходит сейчас:

  • Обработчик проверяет текущую длину файлаплюс сообщение увеличивает длину файла до максимальной.
    • Если длина превышает максимальную, закройте файл
    • Если backupCount больше нуля, поверните все существующие файлы резервной копии, а затем переименуйте файл журнала, добавив .1
    • Открыть файл журнала для добавления.Если там уже есть файл с таким именем, этот файл открывается заново.
  • Записать сообщение в открытый файл журнала.

Помимо установки backupCount на число выше 0, вы также можете изменить параметр mode на 'w', после чего вы обнаружите, что файл усекается каждый раз, когда он получаетслишком большой:

# 'rotate' logfile by truncating:
logFile = RotatingFileHandler(logfilename, mode='w', maxBytes=1024)

Обратите внимание, что файл все равно может стать больше maxBytes, если длина самого нового сообщения превышает 1024 байта.

Нет возможности сохранить все повернутые файлы.Вам действительно придется использовать безумно большое число, или - использовать другую стратегию ротации файлов.Например, TimedRotatingFileHandler вращает файлы через заданный интервал, и если вы оставите backupCount в нуле, он никогда не удалит повернутые резервные копии.

Вы также можете создать подкласс RotatingFileHandler() для реализации собственного переименования.стратегия, обеспечивающая ваш собственный метод doRollover().Вам нужно генерировать уникальные имена, если вы хотите сохранить все резервные копии;Вы можете добавить UUID, чтобы обеспечить это (вместе с датой):

import uuid
from datetime import datetime
from logging import RotatingFileHandler

class InfiniteRotatingFileHandler(RotatingFileHandler):
    def doRollover(self):
        if self.stream:
            self.stream.close()
            self.stream = None
        new_name = '{}.{:%Y%m%d%H%M%S}.{}'.format(
            self.baseFilename, datetime.now(), uuid.uuid4())
        self.rotate(self.baseFilename, new_name)
        if not self.delay:
            self.stream = self._open()
0 голосов
/ 05 июня 2018

Из документов :

, если либо maxBytes, либо backupCount равен нулю, опрокидывание никогда не происходит, поэтому обычно вы хотите установить для backupCount хотя бы 1 и иметьне ноль maxBytes.

Это означает, что без установки backupCount (значение по умолчанию 0) вы не получите никакой функции ролловера

Мне нужно сохранитьвсе логи!Следовательно, если это обязательно, я должен указать какое-то безумно большое число

Да!Установите какое-то безумно большое число и, возможно, добавьте другой скрипт для резервного копирования старых файлов время от времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...