日誌回滾:pythonhtml
什麼是日誌回滾?python
答:app
將日誌信息輸出到一個單一的文件中,隨着應用程序的持續使用,該日誌文件會愈來愈龐大,進而影響系統的性能。所以,有必要對日誌文件按某種條件進行切分,要切分日誌文件。函數
分割日誌的觸發條件:大小、日期,或者大小加上日期。性能
說是切分,其實是,當一個日誌文件達到觸發條件後,對日誌文件進行重命名,以後再新建原來名稱的日誌文件(此時就是空文件了),新產生的日誌就寫入新的日誌文件。ui
爲啥叫回滾呢?當分割的日誌文件達到指定數目的上限個數時,最老的日誌文件就會被刪除。日誌
logging庫提供了兩個能夠用於日誌滾動的class,一個是RotatingFileHandler,它主要是根據日誌文件的大小進行滾動,另外一個是TimeRotatingFileHandler,它主要是根據時間進行滾動。在實際應用中,咱們一般根據時間進行滾動。 orm
經常使用按天分割日誌代碼:htm
在day_log.py中blog
import time import logging import logging.handlers import os # 若是日誌文件夾不存在,則建立 log_dir = "log-day" # 日誌存放文件夾名稱 log_path = os.getcwd() + os.sep + log_dir if not os.path.isdir(log_path): os.makedirs(log_path) # logging初始化工做 logging.basicConfig() # myapp的初始化工做 myapp = logging.getLogger('myapp') myapp.setLevel(logging.INFO) # 添加TimedRotatingFileHandler # 定義一個1天換一次log文件的handler # 保留3箇舊log文件 timefilehandler = logging.handlers.TimedRotatingFileHandler( log_dir + os.sep + "sec.log", when='D', interval=1, backupCount=3 ) # 設置後綴名稱,跟strftime的格式同樣 timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log" # timefilehandler.suffix = "%Y-%m-%d.log" formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s') timefilehandler.setFormatter(formatter) myapp.addHandler(timefilehandler) while True: time.sleep(6) myapp.info("test")
一、按照時間回滾(就是按時間分割日誌,而且限制日誌文件的個數,刪除早期的日誌)
使用TimedRotatingFileHandler
對log,一般有一種想要的效果:log按天切分,天天一個log文件,保留三天內的log,過時刪除。
import time import logging import logging.handlers # logging初始化工做 logging.basicConfig() # myapp的初始化工做 myapp = logging.getLogger('myapp') myapp.setLevel(logging.INFO) # 添加TimedRotatingFileHandler # 定義一個1秒換一次log文件的handler # 保留3箇舊log文件 timefilehandler = logging.handlers.TimedRotatingFileHandler("log1/myapp.log", when='S', interval=1, backupCount=3) # 設置後綴名稱,跟strftime的格式同樣 timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log" formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s') timefilehandler.setFormatter(formatter) myapp.addHandler(timefilehandler) while True: time.sleep(0.1) myapp.info("test")
注意:filehanlder.suffix的格式必須這麼寫,才能自動刪除舊文件,若是設定是天,就必須寫成「%Y-%m-%d.log」,寫成其餘格式會致使刪除舊文件不生效。這個配置在源碼裏能看出來,可是在官方文檔並無說明這一點!!!!!!!!!!
TimedRotatingFileHandler的構造函數定義以下:
TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
filename 是輸出日誌文件名的前綴,好比log/myapp.log
when 是一個字符串的定義以下:
「S」: Seconds
「M」: Minutes
「H」: Hours
「D」: Days
「W」: Week day (0=Monday)
「midnight」: Roll over at midnight
interval 是指等待多少個單位when的時間後,Logger會自動重建文件,固然,這個文件的建立
取決於filename+suffix,若這個文件跟以前的文件有重名,則會自動覆蓋掉之前的文件,因此
有些狀況suffix要定義的不能由於when而重複。
backupCount 是保留日誌個數。默認的0是不會自動刪除掉日誌。若設3,則在文件的建立過程當中
庫會判斷是否有超過這個3,若超過,則會從最早建立的開始刪除。
二、按照大小回滾
RotatingFileHandler基於文件大小切分
這個配置是能夠生效的,符合預期
import time # import logging import logging.handlers # logging初始化工做 logging.basicConfig() # myapp的初始化工做 myapp = logging.getLogger('myapp') myapp.setLevel(logging.INFO) # 寫入文件,若是文件超過100個Bytes,僅保留5個文件。 handler = logging.handlers.RotatingFileHandler( 'logs/myapp.log', maxBytes=500, backupCount=5) formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s') handler.setFormatter(formatter) # 設置後綴名稱,跟strftime的格式同樣 myapp.addHandler(handler) while True: time.sleep(0.1) myapp.info("file test")
三、同時按照時間和大小回滾