Nginx日志回滾


Nginx不像Apache那樣自帶rotatelogs進行日志的回滾,默認配置的日志文件會越來越大造成無法閱讀,必須手動為Nginx配置日志回滾的方式。可以使用自定義腳本或是借助Linux自帶的logrotate命令實現日志回滾。

腳本分割

腳本分割日志的方法比較容易理解,獲取昨天的日期並將日志文件命名為帶有昨天的日期的名稱,重命名結束后向Nginx發送USR1信號,Nginx在收到USR1信號后重新打開日志文件並寫入。

#!/usr/bin/env bash
#anthor ltzhang
#description split_nginx_log

#獲取日志文件的路徑
LOGS_PATH=/opt/openresty/nginx/logs/

#獲取該路徑下所有以.log結尾日志
LOGS_LIST=$(ls $LOGS_PATH/*.log)

#獲取昨天的日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

#for循環遍歷日志列表,將所有日志名稱重命名為*.log.$(YESTERDAY)
for logs in ${LOGS_LIST[@]};do
	varlog=$(basename $logs)
	mv -f $LOGS_PATH/$varlog $LOGS_PATH/$varlog.$YESTERDAY
done

#向Nginx的master進程發送USR1信號,Nginx重新打開*.log並寫入日志
kill -USR1 $(cat ${LOGS_PATH}/../run/nginx.pid)

優點:靈活,文件名及路徑可以自定義

缺點:需要在crontab中設置計划任務,較不方便管理閱讀

logrorate分割

logrotate是linux自帶的日志回滾命令,可以實現日志回滾。logrotate借助crond實現日志回滾的計划任務,所在的路徑為/etc/cron.daily/logrotate,即每天執行一次logrotate腳本。

打開腳本,可以發現內容定義

root 00:13:32  /etc >>> 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

每天按照/etc/logrotate.conf配置文件中的定義執行一次日志回滾操作,並將該日志的狀態寫入/var/lib/logrotate/logrotate.status,如果執行失敗,則錯誤狀態碼寫入message日志中。

繼續打開主配置文件可以看到許多配置

root 00:19:05  /etc >>> grep -v '^$' /etc/logrotate.conf | grep -v '^#'
weekly
rotate 4
create
dateext
include /etc/logrotate.d
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

weekly:每周執行日志回滾

rotate:歷史日志保留4天

create:回滾舊日志后創建新文件。可帶權限,改變屬主屬組。如:create 0664 nginx root

dateext:以日期作為回滾文件的后綴。默認格式YYYYMMDD,其他的格式可用dateformat format_string自行定義。

除此以外還有些常用的參數:

compress:壓縮回滾文件,默認后綴.gz

ifempty:若日志為空也執行回滾操作

maxsize size:除按照時間回滾外還支持文件最大大小回滾,當日志超過定義值時執行一次日志回滾操作,適用於每天日志較大的情況,如Nginx日志等

olddir directory:指定回滾文件的存放路徑,必須與日志文件位於同一文件系統中

prerotate/endscript:定義回滾操作結束后執行的動作

配置Nginx回滾只需要按照上面的參數設置自己的配置段即可,例子如下:

root 01:33:21  /opt/openresty/nginx/logs >>> cat /etc/logrotate.d/openrestry 
/opt/openresty/nginx/logs/*log {
    create 0664 nginx root    
    daily                          
    maxsize 20M
    rotate 14          
    ifempty
    nocompress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /opt/openresty/nginx/run/nginx.pid  2>/dev/null` 2>/dev/null || true
    endscript
}

{% note info %}
如果發現沒有正常回滾,可以使用logrotate -dv /etc/logrotate.conf觀察輸出
{% endnote %}

優點:1)可以定義最大大小,實現單日日志分割 2)可以實現指定數量的歷史日志(腳本也可配置但較復雜)3)不用單獨寫入計划任務

缺點:無


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM