nginx 日誌切割 PS:nginx日誌切割可以通過兩種方式進行切割,日誌logrotate,腳本 方法一:通過logrotate切割 個人感覺配置麻煩,且結合自己這邊的項目的環境的複雜,所以就不使用這種方式。這裡我也就不寫了 可以參考:https://www.cnblogs.com/ilanni ...
nginx 日誌切割
PS:nginx日誌切割可以通過兩種方式進行切割,日誌logrotate,腳本
方法一:通過logrotate切割
個人感覺配置麻煩,且結合自己這邊的項目的環境的複雜,所以就不使用這種方式。這裡我也就不寫了
可以參考:https://www.cnblogs.com/ilanni/p/5365420.html
方法二:通過shell腳本切割
1、編寫shell腳本
#!/bin/bash #此腳本用於自動分割Nginx的日誌,包括access.log和error.log #每天00:00執行此腳本 將前一天的access.log重命名為access-xxxx-xx-xx.log格式,並重新打開日誌文件 #Nginx日誌文件所在目錄 LOG_PATH=/opt/nginx/logs #獲取昨天的日期 YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) #獲取pid文件路徑 PID=/var/run/nginx/nginx.pid #分割日誌 mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log mv ${LOG_PATH}error.log ${LOG_PATH}error-${YESTERDAY}.log #向Nginx主進程發送USR1信號,重新打開日誌文件 kill -USR1 `cat ${PID}`
2、配置crontab每天凌晨00:00定時執行這個腳本
crontab -e # 輸入以下內容並保存 00 00 * * * /bin/bash /opt/nginx/sbin/cut_nginx_log.sh
方法三:通過Python腳本切割
鑒於這種亂情況,日誌目錄下麵還有多個項目的日誌,且分別保存在不同的文件下麵(下麵又分為測試環境的日誌,預發佈環境的日誌),使用shell腳本就不怎麼好寫,我就採取了通過Python來實現
腳本:
import os, sys, datetime,re # nginx日誌存放的路徑 nginxLogPath="/opt/nginx-1.9.5/logs/" # 獲取昨天的日期 yesterday = (datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d") # nginx啟動的pid文件 PID = "/var/run/nginx.pid" def cutNginxLog(path): """ 切割nginx日誌函數 :param path: 日誌文件的第一級目錄 :return: """ logList = os.listdir(path) # 判斷傳入的path是否是目錄 for logName in logList: # 迴圈處理目錄裡面的文件 logAbsPath = os.path.join(path, logName) if os.path.isdir(logAbsPath): # 如果是目錄,遞歸調用自己,繼續處理 cutNginxLog(logAbsPath) else: # 如果是日誌文件,就進行處理 # 分割日誌 re_Num = re.compile(r'^[a-zA-Z]') # 判斷日誌文件是否是字母開頭,如果是日期開頭就不切割 if re_Num.search(logName): logNewName = yesterday + "_" + logName # 新日誌文件名稱列如:2018-11-8_access.log oldLogPath = os.path.join(path, logName) # 舊日誌文件絕對路徑 newLogPath = os.path.join(path, logNewName) # 新日誌文件絕對路徑 os.rename(oldLogPath, newLogPath) cmd = " kill -USR1 `cat %s` "% PID res = os.system(cmd) if res != 0: return "重新載入nginx失敗" cutNginxLog(nginxLogPath)
計劃任務:
# crontab -e 30 02 * * * /usr/bin/python3.5 /opt/nginx-1.9.5/sbin/cut_nginx_log.py
切割後的效果圖: