由於之前沒有作nginx日誌分割,有時候想看日誌的時候老是發現有十幾G的甚至上百G的日誌文件,因而就想使用python寫個nginx日誌分割(固然你也可使用shell來完成都是很簡單)python
需求:
1.按照日分割nginx全部日誌
2.因爲日誌不須要隨時能夠查看,須要作歸檔(壓縮.tar.gz)
3.歸檔日誌須要有過時時間和容量限制(分割日誌須要作按期的刪除,超過必定時間或者目錄大小超過必定容量)nginx
分析:
按照需求,咱們須要 備份前一天日誌---->從新加載日誌文件---->壓縮日誌文件---->檢測備份日誌文件目錄web
好了,也不一一分析腳本,直接發出來了,有什麼問題你們能夠提啊。shell
#coding:utf-8 ''' Version: 1.0.0 Actor:youshumin Date:2018/04/28 腳本需求-- 1.用戶提供一個nginx日誌路徑 (目錄) 2.用戶提供nginxnginx執行路徑 3.備份日誌路徑 4.保留多久的存儲日誌文件或者空間 天和GB爲單位 ''' ####### Nginx_Log_Dir="/data/nginx/web1/" Nginx_Pid_File="/usr/local/nginx/sbin/nginx" Nginx_Bak_Dir="/data/nginx/bak/web1" Nginx_Bak_Day=15 Nginx_Bak_Max_Size=20 ####### import os,time,shutil import tarfile,datetime TIME_Secs=time.strftime("%Y%m%d%H%M%S", time.localtime()) Time_Day=time.strftime("%Y%m%d",time.localtime()) POSSIBLE_TOPDIR=os.path.normpath(os.path.abspath(Nginx_Log_Dir)) Tmp_Work_File=os.path.normpath(os.path.join(POSSIBLE_TOPDIR, TIME_Secs)) def MvLog(Sour_Dir,Desc_dir): Need_Mv_File_List=os.listdir(Sour_Dir) os.mkdir(Desc_dir) for item in Need_Mv_File_List: shutil.move(os.path.join(Sour_Dir,item), Desc_dir) def ReloadNginxLog(Nginx_Sbin): Shell_Command="{0} -s reopen".format(Nginx_Sbin) if os.system(Shell_Command)==0: print "nginx 日誌已經從新加載" def Tar_Log_File(Log_Path,Tar_Dir): Tar_Bak_Name=os.path.normpath(os.path.join(Tar_Dir, "web1_{0}.tar.gz".format(Time_Day))) Tar=tarfile.open(Tar_Bak_Name,"w:gz") Tar.add(Log_Path,arcname=os.path.basename(Log_Path)) Tar.close() shutil.rmtree(Log_Path) def Del_One_Old_File(Del_File_Dir,Check_Day=None): for root, dirs, files in os.walk(Del_File_Dir): files.sort(key=lambda fn: os.path.getctime(os.path.join(root, fn))) if Check_Day==True: OLd_File_Time_Day=datetime.datetime.fromtimestamp(os.path.getctime(os.path.join(root, files[0]))).strftime("%Y%m%d") Time_Now=time.strftime("%Y%m%d",time.localtime()) S_Day=int(Time_Now)-int(OLd_File_Time_Day) return S_Day else: os.remove(os.path.normpath(os.path.join(root,files[0]))) def Check_Ture_Or_Flase(Nginx_Bak_Dir,Bak_Days,Bak_Size): Nginx_Bak_Dir = os.path.normpath(Nginx_Bak_Dir) Size = 0 for root, dirs, files in os.walk(Nginx_Bak_Dir): Size += sum([os.path.getsize(os.path.join(root, name)) for name in files]) Mb_Size = '%.2f' % float(Size / 1024.0 / 1024.0) Mb_Max_Bak_Size = '%.2f' % float(Bak_Size * 1024) Flat = Del_One_Old_File(Nginx_Bak_Dir, True) > Bak_Days or float(Mb_Size) > float(Mb_Max_Bak_Size) return Flat def Check_Bak_Dir(Nginx_Bak_Dir,Bak_Days,Bak_Size): Flat=Check_Ture_Or_Flase(Nginx_Bak_Dir,Bak_Days,Bak_Size) while Flat: Del_One_Old_File(Nginx_Bak_Dir) Flat = Check_Ture_Or_Flase(Nginx_Bak_Dir, Bak_Days, Bak_Size) if Flat==False: break if __name__=="__main__": ''' MvLog 移動當前文件 ReloadNginxLog 重新加載nginx日誌 Tar_Log_File 打包日誌文件 Check_Bak_Dir 檢查日誌備份目錄,是否須要刪除備份日誌 ''' MvLog(POSSIBLE_TOPDIR,Tmp_Work_File) ReloadNginxLog(Nginx_Pid_File) Tar_Log_File(Tmp_Work_File,Nginx_Bak_Dir) Check_Bak_Dir(Nginx_Bak_Dir,Nginx_Bak_Day,Nginx_Bak_Max_Size)