什么是"当=' D' "和"当='午夜'" for TimedRotatingFileHandler?

时间:2016-02-17 03:44:32

标签: python logging

python日志记录模块中when='D'的{​​{1}}和when='midnight'之间的区别是什么?
我无法从官方文件中得到它。

2 个答案:

答案 0 :(得分:13)

TimedRotatingFileHandler有两个相关参数:whenintervalwhen的大多数可能值,例如D天,或H小时,与interval一起使用 - 例如,如果when='D', interval=7指定后,日志将每七天轮换一次。同样,如果指定了when='H', interval=12,那么日志将每12小时轮换一次,从脚本启动时开始。 when='midnight'是一种特殊情况,因为未使用interval参数,并且无论脚本启动的时间如何,日志都会在午夜每天滚动(请参阅源{ {3}})。

答案 1 :(得分:0)

展开Kurt Raschke's answerBrownnightingale's coment

您甚至可以将when="midnight"参数与interval结合使用,并且从python 3.4您甚至可以使用新参数atTime,这样就可以每隔一天轮换一次日志({{1} }),每隔午夜(when='d', interval=2)或一天中其他时间,例如中午(when='midnight', interval=2):

when='midnight', interval=2, atTime=datetime.time()

将输出如下内容:

import datetime
import logging.handlers
import time

noon = datetime.time(hour=12)

handler = logging.handlers.TimedRotatingFileHandler(
    filename='daily.log',
    when='d',
    interval=2)
handler_midnight = logging.handlers.TimedRotatingFileHandler(
    filename='daily.log',
    when='midnight',
    interval=2)
handler_noon = logging.handlers.TimedRotatingFileHandler(
    filename='daily.log',
    when='midnight',
    atTime=noon,
    interval=2)

current_time = int(time.time())
rollover_time = handler.computeRollover(current_time)
rollover_time_midnight = handler_midnight.computeRollover(current_time)
rollover_time_noon = handler_noon.computeRollover(current_time)

print('current time: {}'.format(datetime.datetime.fromtimestamp(current_time)))
print('next log rotation: {}'.format(datetime.datetime.fromtimestamp(rollover_time)))
print('next midnight log rotation: {}'.format(datetime.datetime.fromtimestamp(rollover_time_midnight)))
print('next noon log rotation: {}'.format(datetime.datetime.fromtimestamp(rollover_time_noon)))