清除過期日志的py腳本


本篇和大家分享的是一個清除過期日志的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


免責聲明!

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



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