Ротация логов в Python

Недавно возникла задача сделать ротацию логов в веб-сервисе на Tornado. До начала работы казалось, что вопрос должен быть давно изучен и решение будет очевидным.

Но, как это часто случается, если требования несколько отличаются от стандартных, то приходится искать решение самостоятельно. Или читать документацию.

TL;DR

Если необходимо реализовать ротацию логов таким образом, чтобы файлы создавались ежедневно и имя файла соотвествовало формату %Y%m%d.%i.log, где %Y — год, %m — месяц, %d — день, %i — индекс текущего файла лога, то необходимо использовать TimedRotatingFileHandler и настраивать формат имени файла переопределяя свойства namer и suffix этого класса:

def get_filename(filename):
    # Получаем директорию, где расположены логи
    log_directory = os.path.split(filename)[0]

    # Расширением (с точкой) файла является значение suffix (у нас - %Y%m%d) (например .20181231).
    # Но точка нам не нужна, т.к. файл будет называться suffix.log (20181231.log)
    date = os.path.splitext(filename)[1][1:]

    # Сформировали имя нового лог-файла
    filename = os.path.join(log_directory, date)

    if not os.path.exists('{}.log'.format(filename)):
        return '{}.log'.format(filename)

    # Найдём минимальный индекс файла на текущий момент.
    index = 0
    f = '{}.{}.log'.format(filename, index)
    while os.path.exists(f):
        index += 1
        f = '{}.{}.log'.format(filename, index)
    return f

rotation_logging_handler = TimedRotatingFileHandler('./logs/log.log', when='m', interval=1, backupCount=5)
rotation_logging_handler.suffix = '%Y%m%d'
rotation_logging_handler.namer = get_filename

logger.addHandler(rotation_logging_handler)

Более подробно можете ознакомиться на сайте makesomecode.me

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.