python / django中的每小时日志轮换

时间:2013-03-21 11:10:00

标签: python django logging

当我在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,而不是记录开始的时间,每个日志只包含日志文件名所指示的小时内的日志?

3 个答案:

答案 0 :(得分:3)

查看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, ...)

(未测试的)

答案 1 :(得分:0)

我还附上另一个答案。 Python日志记录支持WatchedFileHandler,如果发现文件信息更新,它将关闭并重新打开具有相同文件名的日志文件。它与Linux logrotate守护程序一样可以很好地与系统级日志循环一起使用。

答案 2 :(得分: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)