1

当我在python logging和一些实验中检查了 Python 文档时,我不太明白,

第一次计算下一次翻转时间时(当创建处理程序时),现有日志文件的最后修改时间,或者当前时间,用于计算下一次轮换发生的时间。

我发现每小时轮换的轮换时间受我开始记录的时间影响,比如 12:23:33 开始,下一次轮换是 13:23:33,这最终会混淆日志文件名。

代码就像,

TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

任何强制每小时日志轮换的方式从 00 分钟开始,例如 13:00:00 而不是日志记录开始的时间,并且每个日志将仅包含其日志文件名指示的小时内的日志?

4

3 回答 3

4

查看 的代码TimedRotatingFileHandler,您不能强制它以特定的分钟值旋转:根据文档,logfile last modification time + interval如果日志文件已经存在或current time + interval不存在,则下一次翻转将发生。

但是由于您似乎知道文件名,您可以TimedRotatingFileHandler通过首先将日志文件的最后修改时间设置为当前时间来欺骗:

from    datetime import datetime
import  os, time

thishour = datetime.now().replace(minute = 0, second = 0, microsecond = 0)
timestamp = time.mktime(thishour.timetuple())

# this opens/creates the logfile...
with file(filename, 'a'):
    # ...and sets atime/mtime
    os.utime(filename, (timestamp, timestamp))

TimedRotatingFileHandler(filename, ...)

(未经测试)

于 2013-03-21T11:57:02.563 回答
1

我还附上另一个答案。Python 日志支持 WatchedFileHandler,如果发现文件信息更新,它将关闭并重新打开具有相同文件名的日志文件。它与 linux logrotate 守护程序一样的系统级日志轮换很好地工作。

于 2013-04-07T12:09:36.883 回答
0
    logger = logging.getLogger()

    log_format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
    logging.basicConfig(format=log_format, level=level)

    # Create 'log' directory if not present
    log_path = os.path.dirname(logfile)
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    handler = TimedRotatingFileHandler(
        logfile,
        when="H",
        interval=1,
        encoding="utf-8")

    handler.setFormatter(logging.Formatter(log_format))
    handler.extMatch = re.compile(r"^\d{8}$")
    handler.suffix = "%Y%m%d"
    handler.setLevel(level)

    logger.addHandler(handler)
于 2018-10-26T11:47:26.017 回答