Почему мой TimedRotatingFileHandler не вращается в полночь? - PullRequest
9 голосов
/ 16 августа 2010

Это мой конфигурационный файл:

[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=

В своем коде я настраиваю и использую регистратор следующим образом:

import logging
import logging.config

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

Сообщения регистрируются в указанном мной файле (driver.log), но ротации в полночь никогда не происходят.

Должен ли процесс выполняться в полночь, чтобы произошло вращение? Это пакетный процесс, который я запускаю каждые 15 минут, и он никогда не запускается в полночь.

Ответы [ 3 ]

18 голосов
/ 17 августа 2010

Ответ заключается в том, что процесс должен работать все время, чтобы он работал правильно.

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

Ротация должна происходить, когда процесс регистрации создает обработчик до полуночи и выполняет вызов регистрации, предназначенный для этого обработчика после полуночи.

2 голосов
/ 16 августа 2010

Я думаю, это действительно происходит только тогда, когда процесс запущен в полночь.В вашем случае (cronjob не выполняется очень долго), вы должны использовать простой файл журнала, в котором текущая дата добавляется в имя файла журнала.Таким образом, «опрокидывание» происходит автоматически.

1 голос
/ 22 февраля 2016

Я также столкнулся с этой проблемой, по разным причинам я не мог использовать rotatelog, а cron для вращения журналов просто добавляет дополнительную вещь, которая может пойти не так.Я использовал функцию ниже, чтобы вращать файлы, ежедневно.

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

Я вызываю это, чтобы вращать мои журналы перед инициализацией регистратора.

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