为何我的TimedRotatingFileHandler在午夜不旋转?

12 投票
3 回答
18739 浏览
提问于 2025-04-16 02:52

这是我的配置文件:

[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 个回答

1

我也遇到过这个问题,出于各种原因我不能使用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

我在初始化日志记录器之前调用这个函数来轮换我的日志。

4

我猜这种情况通常只会在午夜时分发生。在你的例子里(定时任务运行时间不长),你可以使用一个简单的日志文件,把当前日期加到日志文件的名字里。这样一来,文件就会自动更新,不用你手动去处理。

23

答案是,为了让这个功能正常工作,程序必须一直在运行。

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

日志轮转应该在日志记录的程序在午夜之前创建处理器,并在午夜之后对这个处理器进行日志记录时发生。

撰写回答