Nginx日志切割脚本
Eave
2017.06.07 10:36
在nginx的使用过程中,产生的日志都在一个文件中,nginx没有日志文件rotate功能。如果不处理,日志文件将变得越来越大,所以我没需要写一个nginx日志切割脚本来自动切割日志文件。
脚本编写思路如下:
定义日志存放的目录,便于切割日志时获取日志文件
logs_path="/var/log/nginx/"
将日志文件重命名,比如日志按天生成(access-20170607.log)
mv access.log access-$(date -d "-1 day" +"%Y%m%d").log
注意:重命名日志文件,在你未重新打开原名字的日志文件前,实际nginx的日志还是打印在重命名的日志文件里面,linux是靠文件描述符而不是文件名定位文件,所以我们还要执行下一步,让nginx写入新的log文件
获取nginx的主进程pid,并向nginx主进程发送USR1信号
kill -USR1 `cat /usr/local/nginx/nginx.pid`
nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者。
nginx日志按日期自动切割脚本如下:
#!/bin/bash
# This script run at 00:00
# The Nginx logs path
logs_path="/var/log/nginx/"
files=`ls ${logs_path}`
mkdir -p ${logs_path}$(date -d "-1 day" +"%Y")/$(date -d "-1 day" +"%m")/
for i in $files
do
if [ -f ${logs_path}${i} ]
then
is=`echo $i | sed 's/.log$//g'`
mv ${logs_path}${i} ${logs_path}$(date -d "-1 day" +"%Y")/$(date -d "-1 day" +"%m")/${is}-$(date -d "-1 day" +"%Y%m%d").log
fi
done
kill -USR1 `cat /usr/local/nginx/nginx.pid`
写好nginx日志的自动切割日志之后,保存脚本(例如保存到/var/www/scripts/cut_nginx_log.sh),并给脚本添加可执行权限,将脚本使用crontab每天定时执行一次即可。
# 给脚本添加可执行权限
chmod 755 /var/www/scripts/cut_nginx_log.sh
# crontab -e 增加以下代码
0 0 * * * /var/www/scripts/cut_nginx_log.sh > /dev/null 2>&1
这样每天凌晨0点0分就会自动切割nginx日志,并保存了,当然时间长了,日志文件还是会很多,建议定期清理历史的分割文件,比如保存30天。