日志回滾:python
什么是日志回滾?
答:
將日志信息輸出到一個單一的文件中,隨着應用程序的持續使用,該日志文件會越來越龐大,進而影響系統的性能。因此,有必要對日志文件按某種條件進行切分,要切分日志文件。
分割日志的觸發條件:大小、日期,或者大小加上日期。
說是切分,實際上是,當一個日志文件達到觸發條件后,對日志文件進行重命名,之后再新建原來名稱的日志文件(此時就是空文件了),新產生的日志就寫入新的日志文件。
為啥叫回滾呢?當分割的日志文件達到指定數目的上限個數時,最老的日志文件就會被刪除。
logging庫提供了兩個可以用於日志滾動的class,一個是RotatingFileHandler,它主要是根據日志文件的大小進行滾動,另一個是TimeRotatingFileHandler,它主要是根據時間進行滾動。在實際應用中,我們通常根據時間進行滾動。
常用按天分割日志代碼:
在day_log.py中
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")
1、按照時間回滾(就是按時間分割日志,並且限制日志文件的個數,刪除早期的日志)
使用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,若超過,則會從最先創建的開始刪除。
2、按照大小回滾
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")
3、同時按照時間和大小回滾