Nginx自带没有日志轮循功能,需要借助系统logrotate或自写脚本实现,下面是使用脚本来实现:
#!/bin/bash
# Author:Chris __On 2016/10/28
# =====================Description=====================
# [Features]: Nginx logrotate & Backup Logs.
# [Usage]: Add a scheduled task:
# 0 0 * * * /root/Scripts/logrotate_nginx.sh
# =====================================================
# Defined Color
Red='\033[31m\033[1m' # \e[1;31m
Green='\033[32m\033[1m' # \e[1;32m
Blue='\033[94m' # \e[0;94m
Null='\033[0m' # \e[0m
# <----------------------------Configure Start--------------------------->
Logdir="/data/nginx/logs"
Bakdir="/data/backup/logs/nginx"
Pidfile="/data/nginx/logs/nginx.pid"
Pid=$(cat ${Pidfile})
Date=$(date -d yesterday +%Y-%m-%d)
Rather=8192
# <----------------------------Configure End---------------------------->
Checkdo (){
if [ "$?" -ne 0 ];then
echo -n .
echo -e "[ ${Red}NO${Null} ]"
echo -e "${Red}Execte Faild.${Null}"
exit 1
fi
echo -n .
echo -e "[ ${Green}OK${Null} ]"
}
echo -e Starting Nginx logrotate in dir: ${Blue}${Logdir}${Null}...
echo -n 1.Detect Directory..
if [ ! -d ${Logdir} ];then
echo -n .
echo -e "[ ${Red}NO${Null} ]"
echo -e "${Red}Log directory ${Logdir} is not exist.${Null}"
exit 1
fi
if [ ! -d ${Bakdir} ];then
mkdir -p ${Bakdir}
fi
echo -n .
echo -e "[ ${Green}OK${Null} ]"
# Rotate Log.
echo -n 2.Rotating log..
cd ${Logdir}
ls -l | grep -E .log$ \
| while read line
do
fsize=$(echo $line | awk '{print $5}')
fname=$(echo $line | awk '{print $NF}')
lname=${Date}-${fname}
if [ "${fsize}" -lt "${Rather}" ];then
continue
fi
mv ${fname} ${Bakdir}/${lname}
done
Checkdo
# Send USR1 signal to Nginx.
echo -n 3.Send USR1 singal to Nginx..
kill -USR1 ${Pid} > /dev/null 2>&1
Checkdo
# Compress log files.
echo -n 4.Compressing log files..
cd ${Bakdir}
tar czf ${Date}.tar.gz ${Date}-* --remove-files
Checkdo
echo -e "${Green}Logrorate Complated!${Null}"
思路:将日志文件移动出来,然后给Nginx发出USR1指令(因为Nginx是按文件的inode来写入日志的)。