本篇和大家分享的是一個清除過期日誌的python腳本,年後第二篇希望對大家有幫助; 該python腳本創建的由來 代碼及分析 crontab定時任務 該python腳本創建的由來 此由來,是在過年假期時突然被反饋告警伺服器磁碟空間占用比例增大,當時通過df等命令定位到,是使用了某個開源任務調度框架日 ...
本篇和大家分享的是一個清除過期日誌的python腳本,年後第二篇希望對大家有幫助;
- 該python腳本創建的由來
- 代碼及分析
- crontab定時任務
該python腳本創建的由來
此由來,是在過年假期時突然被反饋告警伺服器磁碟空間占用比例增大,當時通過df等命令定位到,是使用了某個開源任務調度框架日誌增大並之前很多歷史日誌沒有自動刪除導致的;
因此,查看該框架的文檔是否有自動清除配置,暫時沒有找到自動清除日誌的配置說明,於是乎瀏覽源碼就是log4來記錄的,本來打算擴展重寫下log4讓其具有自動清除日誌的功能,但是想到以後可能還有其他項目的日誌無法自動清除,於是乎有了本篇分享的python產出,僅僅配置下檢測路徑即可刪除自定義n天之前的日誌
代碼及分析
先來上代碼,具體如下:
1 #! /usr/bin/python 2 #coding=utf-8 3 import os 4 import datetime 5 import time 6 7 8 class DoFile(): 9 # 獲取某個磁碟路徑里所有文件 10 def getFiles(self, strDir, isLoop, overDay): 11 files = [] 12 if len(strDir) <= 0 or not os.path.exists(strDir): 13 return files 14 dirs = os.listdir(strDir) 15 for dir in dirs: 16 path = os.path.join(strDir, dir) 17 if(os.path.isfile(path) and path.find(".log") >= 0): # 是.log文件 18 if(self.compareFileTime(path, -overDay)): 19 files.append(path) 20 elif(os.path.isdir(path) and isLoop): # 是磁碟 21 files.extend(self.getFiles(path, isLoop, overDay)) 22 else: 23 continue 24 return files 25 26 # 綜合處理磁碟文件 27 def doFiles(self, clearDirs, isLoop=False, overDay=3): 28 print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M")+":執行中...") 29 for dir in clearDirs: 30 files = self.getFiles(dir, isLoop, overDay) 31 print("{}查詢出{}個文件".format(dir, len(files))) 32 self.clearFiles(files) 33 print("執行完畢...") 34 35 # 清除文本文件 36 def clearFiles(self, files): 37 for file in files: 38 strcmd = "rm -rf {}".format(file) 39 self.exec_cmd(strcmd) 40 41 #執行腳本命令 42 def exec_cmd(self, strcmd): 43 os.system(strcmd) 44 45 #獲取文件創建時間 46 def getCreateFileTime(self, path): 47 return os.path.getctime(path) 48 49 #時間戳轉datetime 50 def TimeStampToTime(self,timestamp): 51 return datetime.datetime.utcfromtimestamp(timestamp) 52 53 #比較當前時間與文件創建時間差值(天) 54 def compareFileTime(self, path,overDay): 55 comparTime = self.TimeStampToTime(self.getCreateFileTime(path)) 56 now = datetime.datetime.utcnow() + datetime.timedelta(days= overDay) 57 return now > comparTime 58 59 60 # 要清除文本的磁碟 61 clearDirs = ["/data1/data/logs/xxl-job-web"] 62 doFile = DoFile() 63 doFile.doFiles(clearDirs, True,3)
其邏輯可以分為下麵幾步:
- 從doFiles進入,先去獲取配置的clearDirs數組中的日誌所在磁碟路徑下麵的日誌文件
- 獲取待刪除的文件,這些文件以.log尾碼結尾,並且通過時間限定策略【當前時間+(-n天) > 文本日誌創建時間】來識別哪些到期該刪除了
- 最後通過執行rm -rf命令直接刪除符合時間策略的日誌文件
crontab定時任務
上面只有了清除日誌的py腳本,但是要定時執行該腳本才能到達自動的目的,不然每次都手動運行py腳本和直接手動刪除日誌文件沒上面太大的區別和省時間,因此這裡用到了crontab任務;編輯cron任務如下命令:
1 crontab -e
編輯cron任務,往裡面添加定時每周或者每天執行上面的python腳本
1 0 0 */1 * * python /abc/python/clearDirLog.py > /abc/python/dolog.log 2>&1
上面cron表達式意思:定時每天執行一次clearDirLog.py腳本,並把clearDirLog.py裡面列印出來的信息記錄到dolog.log文件中;編輯任務保存後,我們可以通過如下命令查看cron的任務列表:
1 crontab -l