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


日志回滾: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、同時按照時間和大小回滾

 參考:https://www.cnblogs.com/yonghuacui/p/6177886.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM