日誌回滾:python(日誌分割)

日誌回滾: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")

  

 

三、同時按照時間和大小回滾

 參考:http://www.javashuo.com/article/p-wdgvzaec-q.html

相關文章
相關標籤/搜索