1. 程式人生 > 實用技巧 >Nginx使用Logrotate工具實現日誌切割

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面試題戳領