Nginx使用Logrotate工具實現日誌切割
日誌檔案包含了關於系統中發生的事件的有用資訊,在排障過程中或者系統性能分析時經常被用到。對於忙碌的伺服器,日誌檔案大小會增長極快,伺服器會很快消耗磁碟空間,這成了個問題。除此之外,處理一個單個的龐大日誌檔案也常常是件十分棘手的事。
Nginx日誌切割方式有很多種,本章節拿出兩種案例來進行分享,分別為 Logrotate 工具切割和指令碼切割。
Logrotate切割Nginx日誌
切割方式一
[root@nginx_proxy02 /]# vim /etc/logrotate.d/nginx #按天覆制清空切割 /usr/local/nginx/logs/*.log { daily rotate 30 missingok notifempty compress nodelaycompress copytruncate dateext dateformat -%Y-%m-%d dateyesterday } 配置解析: #按天切割|保留30個日誌檔案|切割中遇到日誌錯誤忽略|日誌如果為空將不進行切割和壓縮| #以gzip方式壓縮|不要將剛切割後的日誌檔案放到下個迴圈中進行壓縮|複製源日誌檔案後並清空源日誌檔案| #切割後的檔案新增日誌副檔名|擴充套件方式為 -%Y-%m-%d|切割後的檔案日誌命名為昨天的日期| #手動執行切割(我們做測試使用) 1.寫入30M內容 [root@nginx_proxy02 logs]# head -c 30M < /dev/urandom > /usr/local/nginx/logs/error.log [root@nginx_proxy02 logs]# head -c 30M < /dev/urandom > /usr/local/nginx/logs/access.log [root@nginx_proxy02 logs]# head -c 30M < /dev/urandom > /usr/local/nginx/logs/access.json 2.強制執行切割(不管是否到了任務計劃自動執行時間) [root@nginx_proxy02 logs]# logrotate -vf /etc/logrotate.d/nginx -v 顯示切割過程中的詳細資訊 -f 強制執行切割 3.檢視切割效果 [root@nginx_proxy02 logs]# ls -lrth total 91M -rw-r--r-- 1 nginx root 31M Mar 25 17:09 error.log-2020-03-24.gz -rw-r--r-- 1 nginx root 31M Mar 25 17:09 access.log-2020-03-24.gz -rw-r--r-- 1 nginx root 30M Mar 25 17:09 access.json -rw-r--r-- 1 nginx root 0 Mar 25 17:11 access.log -rw-r--r-- 1 nginx root 0 Mar 25 17:11 error.log
切割方式二
[root@nginx_proxy02 /]# vim /etc/logrotate.d/nginx #向Nginx傳送訊號重新開啟日誌檔案切割 /usr/local/nginx/logs/*.log { daily rotate 30 missingok notifempty compress nodelaycompress dateext dateformat -%Y-%m-%d dateyesterday postrotate if [ -f /usr/local/nginx/run/nginx.pid ];then kill -USR1 `cat /usr/local/nginx/run/nginx.pid` fi endscript } 配置解析: #按天切割|保留30個日誌檔案|切割中遇到日誌錯誤忽略|日誌如果為空將不進行切割和壓縮| #以gzip方式壓縮|不要將剛切割後的日誌檔案放到下個迴圈中進行壓縮| #切割後的檔案新增日誌副檔名|擴充套件方式為 -%Y-%m-%d|切割後的檔案日誌命名為昨天的日期| #在切割後執行 postrotate / endscript 之間的命令,向nginx傳送訊號重新開啟日誌
切割方式三
#不同格式檔案大小切割 "/usr/local/nginx/logs/access.log" "/usr/local/nginx/logs/error.log" /usr/local/nginx/logs/access.json { size 100M rotate 30 missingok notifempty compress nodelaycompress copytruncate dateext dateformat -%Y-%m-%d-%H } 配置解析: 與上兩種方法區別為把 daily 引數改為了 size 引數,取消了 dateyesterday 引數
切割時間
上面講logrotate按時間切割有 天|周|月|年,可具體時間是幾點鐘?
logrotate預設的定時任務放在了 /etc/cron.daily/logrotate 檔案中
[root@nginx_proxy02 logs]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
可是上面指令碼中只寫入了執行 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf logotate的命令,然後下面有一個判斷執行是否成功,並沒有時間,這該去哪裡找?
logrotate的行為也是受crontab控制,而crontab任務是手anacron控制,所以來看anacrontab
[root@nginx_proxy02 logs]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
所有系統級別的計劃任務都是在上面指令碼 START_HOURS_RANGE= 指定的時間點內執行,3-22 表示每天的凌晨 3點-22點內,隨機執行,是不是很扯淡,彆著急往下看。
我們可以修改 START_HOURS_RANGE= 23-24 (這是日誌切割時間點,即只在23點到24點開始切割,不出意外就是23點啦),當然我們可以自己寫crontab任務,不過要把 logrotate 的任務計劃給刪掉。然後在每天凌晨00:00進行切割nginx日誌
[root@nginx_proxy02 logs]# rm -rf /etc/cron.daily/logrotate
[root@nginx_proxy02 logs]# crontab -e
#Nginx logs cut
00 00 * * * /sbin/logrotate -f /etc/logrotate.d/nginx
※更多文章和資料|點選後方文字直達 ↓↓↓
100GPython自學資料包
阿里雲K8s實戰手冊
[阿里雲CDN排坑指南]CDN
ECS運維指南
DevOps實踐手冊
Hadoop大資料實戰手冊
Knative雲原生應用開發指南
OSS 運維實戰手冊
雲原生架構白皮書
Zabbix企業級分散式監控系統原始碼文件
Linux&Python自學資料包
10G面試題戳領