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)不用單獨寫入計划任務
缺點:無