實際應用中遇到TimedRotatingFileHandler不滾動的問題
阿新 • • 發佈:2017-12-07
mat 文件的 lena mes asc over mage 執行 file
需求:
程序每天晚上8點和10點定時運行,期望日誌按日期記錄
添加Handler部分代碼如下:
formatter = logging.Formatter("%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s", "%Y-%m-%d %H:%M:%S") log_file_handler = logging.handlers.TimedRotatingFileHandler(filename="loaddata.log", when="D", interval=1, backupCount=30) log_file_handler.setFormatter(formatter) logging.getLogger().addHandler(log_file_handler)
查看過很多資料,代碼並沒有問題
現象:
只有一個日誌(loaddata.log)文件被生成,其中會有所有天的日誌,期望的loaddata.log.YYYY-mm-dd並沒有看到
研究:
追查代碼,看到handlers.py(Python自帶模塊)中是這樣計算日誌文件重新生成時間的
下面的 result 是下一次rollover的時間,上面的 t 是handler初始化時獲取的起始時間。
可以看到logging模塊得到的結果是這樣的:
- 起始時間 = 日誌文件的最後修改時間
- 下次滾動時間 = 起始時間 + 1天(因為我設置的when=‘D‘)
又因為,我每天要在20點和22點各執行一次,並且每次都有日誌寫入。因此:
- 20點執行時,起始時間 = 昨天晚上22點;下次滾動時間 = 昨天22點 + 1天 = 今天22點。所以不滾動
- 22點執行時,起始時間 = 今天20點;下次滾動時間 = 今天20點 + 1天 = 明天20點。所以不滾動
所以:導致的結果就是。。。永遠不滾動!/(ㄒoㄒ)/~~
解決辦法:
創建Handler時,把when=‘D‘改成when=‘MIDNIGHT‘可解決這個問題。因為MIDNIGHT指的是,只要過了0點就會滾動。
實際應用中遇到TimedRotatingFileHandler不滾動的問題