我們都知道,默認(rèn)情況下,nginx的項(xiàng)目log是一直被累計(jì)寫入的,隨著時(shí)間越久,那么這個(gè)文件就會(huì)越大,這個(gè)時(shí)候如果我們要去做一些查找和排查就會(huì)比較困難,因?yàn)槿罩疚募?,操作起來比較費(fèi)勁。
因此我們?yōu)榱艘?guī)避這個(gè)問題,提出日志切割的方案。
那日志切割的原理是怎么樣的,我們來分析一下,我們先統(tǒng)計(jì)下連續(xù)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
我們可以發(fā)現(xiàn),日志每天都在變大,時(shí)間越久,就越大,那么我們切割,應(yīng)該按照什么規(guī)則來切割呢?
一般情況下,我們都是按日期來切割,例如:
xxx.com.access.log20230501的日志保存為一個(gè)文件,表示5-1的日志,
xxx.com.access.log20230502的日志保存為一個(gè)文件,表示5-2的日志,
xxx.com.access.log20230503的日志保存為一個(gè)文件,表示5-3的日志,
。。。。。。
也就是每天的日志保存一個(gè)文件,至于保存多久,根據(jù)實(shí)際情況而定,3天,10天,30天,60天,更久都可以,只是保留的天數(shù)越多,文件個(gè)數(shù)就越多而已
理解了這個(gè)思路,那么我們接下來要做的事情就是從xxx.com.access.log里面把指定日期的日志提取出來并單獨(dú)保存為一個(gè)文件,我們使用腳本來實(shí)現(xiàn):
#!/bin/bash # Nginx日志切割 # 在/data/log/nginx目錄下生成類似xxx.log20230526格式的日志,并保留前30天數(shù)據(jù) # 創(chuàng)建計(jì)劃任務(wù),每天0點(diǎn)0分執(zhí)行:0 0 * * * /data/script/nginx_log_rotation.sh
#你的日志所在目錄 LOG_PATH=/data/logs/nginx
#你的nginx服務(wù)運(yùn)行的pid文件 PID=/usr/local/nginx/logs/nginx.pid
#昨天的日期 YESTERDAY=`date -d "yesterday" +%Y-%m-%d`
#因?yàn)槿罩灸夸浝锩婵赡苡卸鄠€(gè)項(xiàng)目,這里我們使用循環(huán)讀取的方式 for i in `find ${LOG_PATH} -maxdepth 1 -type f|grep -v '[0-9]$'`; do mv $i $i${YESTERDAY} done
#重新生成一個(gè)新的日志文件,用來保存新的數(shù)據(jù) kill -USR1 `cat ${PID}`
#刪除創(chuàng)建時(shí)間在30天以前的日志文件 find ${LOG_PATH} -mtime +30 -name "*[0-9][0-9]" | xargs rm -f exit 0
通過試驗(yàn),我發(fā)現(xiàn)上面標(biāo)紅那句話說的不是很準(zhǔn)確,因此來糾正一下
05-20項(xiàng)目上線,不管是什么時(shí)間點(diǎn),早上,上午,下午,還是晚上都一樣,xxx.com.access.log持續(xù)寫入日志,那么這些日志的日期肯定都是05-20
然后05-21 00:00:00的時(shí)候執(zhí)行一次腳本,通過mv命令把xxx.com.access.log日志(日期全是05-20)重命名為xxx.com.access.log20230520,并重新生成了一個(gè)空的xxx.com.access.log文件,用于繼續(xù)寫入日志,此時(shí)再寫入的日志的日期已經(jīng)是05-21了
然后05-22 00:00:00的時(shí)候執(zhí)行一次腳本,通過mv命令把xxx.com.access.log日志(日期全是05-21)重命名為xxx.com.access.log20230521,并重新生成了一個(gè)空的xxx.com.access.log文件,用于繼續(xù)寫入日志,此時(shí)再寫入的日志的日期已經(jīng)是05-22了
然后05-23 00:00:00的時(shí)候執(zhí)行一次腳本,通過mv命令把xxx.com.access.log日志(日期全是05-22)重命名為xxx.com.access.log20230522,并重新生成了一個(gè)空的xxx.com.access.log文件,用于繼續(xù)寫入日志,此時(shí)再寫入的日志的日期已經(jīng)是05-23了
。。。。。。
以此內(nèi)推,結(jié)論是:每日凌晨0點(diǎn)把前一天的日志文件按日期重命名,并生成一個(gè)新的日志文件,用來寫入當(dāng)天的日志,而不是剛開始理解的按日期去xxx.com.access.log里面提取指定日期的日志了。
當(dāng)然了,在重命名文件的時(shí)候,同步寫入數(shù)據(jù)日期可能是第二天的數(shù)據(jù)(也就是xxx.com.access.log20230520文件里面最后一條數(shù)據(jù)是05-21的),或者數(shù)據(jù)丟失的情況,我們可以忽略不計(jì)哈。文章來源:http://www.zghlxwxcb.cn/news/detail-459765.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-459765.html
到了這里,關(guān)于linux服務(wù)器,nginx日志切割保存的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!