我們都知道,預設情況下,nginx的項目log是一直被累計寫入的,隨著時間越久,那麼這個文件就會越大,這個時候如果我們要去做一些查找和排查就會比較困難,因為日誌文件太大,操作起來比較費勁。 因此我們為了規避這個問題,提出日誌切割的方案。 那日誌切割的原理是怎麼樣的,我們來分析一下,我們先統計下連續1 ...
我們都知道,預設情況下,nginx的項目log是一直被累計寫入的,隨著時間越久,那麼這個文件就會越大,這個時候如果我們要去做一些查找和排查就會比較困難,因為日誌文件太大,操作起來比較費勁。
因此我們為了規避這個問題,提出日誌切割的方案。
那日誌切割的原理是怎麼樣的,我們來分析一下,我們先統計下連續10天的日誌文件情況
-rw-r--r-- 1 nginx root 60M May 1 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 100M May 2 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 200M May 3 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 500M May 4 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 800M May 5 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 1G May 6 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 1.5G May 7 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 2G May 8 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 2.5G May 9 10:28 xxx.com.access.log -rw-r--r-- 1 nginx root 2.9G May 10 10:28 xxx.com.access.log
我們可以發現,日誌每天都在變大,時間越久,就越大,那麼我們切割,應該按照什麼規則來切割呢?
一般情況下,我們都是按日期來切割,例如:
xxx.com.access.log20230501的日誌保存為一個文件,表示5-1的日誌,
xxx.com.access.log20230502的日誌保存為一個文件,表示5-2的日誌,
xxx.com.access.log20230503的日誌保存為一個文件,表示5-3的日誌,
。。。。。。
也就是每天的日誌保存一個文件,至於保存多久,根據實際情況而定,3天,10天,30天,60天,更久都可以,只是保留的天數越多,文件個數就越多而已
理解了這個思路,那麼我們接下來要做的事情就是從xxx.com.access.log裡面把指定日期的日誌提取出來並單獨保存為一個文件,我們使用腳本來實現:
#!/bin/bash # Nginx日誌切割 # 在/data/log/nginx目錄下生成類似xxx.log20230526格式的日誌,並保留前30天數據 # 創建計劃任務,每天0點0分執行:0 0 * * * /data/script/nginx_log_rotation.sh
#你的日誌所在目錄 LOG_PATH=/data/logs/nginx
#你的nginx服務運行的pid文件 PID=/usr/local/nginx/logs/nginx.pid
#昨天的日期 YESTERDAY=`date -d "yesterday" +%Y-%m-%d`
#因為日誌目錄裡面可能有多個項目,這裡我們使用迴圈讀取的方式 for i in `find ${LOG_PATH} -maxdepth 1 -type f|grep -v '[0-9]$'`; do mv $i $i${YESTERDAY} done
#重新生成一個新的日誌文件,用來保存新的數據 kill -USR1 `cat ${PID}`
#刪除創建時間在30天以前的日誌文件 find ${LOG_PATH} -mtime +30 -name "*[0-9][0-9]" | xargs rm -f exit 0
通過試驗,我發現上面標紅那句話說的不是很準確,因此來糾正一下
05-20項目上線,不管是什麼時間點,早上,上午,下午,還是晚上都一樣,xxx.com.access.log持續寫入日誌,那麼這些日誌的日期肯定都是05-20
然後05-21 00:00:00的時候執行一次腳本,通過mv命令把xxx.com.access.log日誌(日期全是05-20)重命名為xxx.com.access.log20230520,並重新生成了一個空的xxx.com.access.log文件,用於繼續寫入日誌,此時再寫入的日誌的日期已經是05-21了
然後05-22 00:00:00的時候執行一次腳本,通過mv命令把xxx.com.access.log日誌(日期全是05-21)重命名為xxx.com.access.log20230521,並重新生成了一個空的xxx.com.access.log文件,用於繼續寫入日誌,此時再寫入的日誌的日期已經是05-22了
然後05-23 00:00:00的時候執行一次腳本,通過mv命令把xxx.com.access.log日誌(日期全是05-22)重命名為xxx.com.access.log20230522,並重新生成了一個空的xxx.com.access.log文件,用於繼續寫入日誌,此時再寫入的日誌的日期已經是05-23了
。。。。。。
以此內推,結論是:每日凌晨0點把前一天的日誌文件按日期重命名,並生成一個新的日誌文件,用來寫入當天的日誌,而不是剛開始理解的按日期去xxx.com.access.log裡面提取指定日期的日誌了。
當然了,在重命名文件的時候,同步寫入數據日期可能是第二天的數據(也就是xxx.com.access.log20230520文件裡面最後一條數據是05-21的),或者數據丟失的情況,我們可以忽略不計哈。