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天。