关于nginx日志定时切割、一般有两种方案,第一用logrotate,它是一个linux系统日志的管理工具、它可以切割、压缩等其他软件的日志文件软件;logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。第二种用shell脚本定时切割。

    第一种方案:logrotate

        1、安装logrotate,我这里是centos直接用:yum -y install logroate

        2、安装成功后、配置logrotate。/etc/logrotate.conf是logrotate的配置文件,打开该文件内容,显示如下:

wKiom1eJqGbh2LkNAAN1aaCBY5k668.png-wh_50

标红处很关键,引入文件用的,所以我在该引入目录下新建了一个nginx文件,内容如下:

/var/log/nginx/access/*.log {
    #按天切割
    daily
    #在日志轮循期间,任何错误将被忽略
    missingok
    #一次存储30个日志文件。对于第31个日志文件,时间最久的那个日志文件将被删除。
    rotate 30
    #按日期格式显示切割后的文件名
    dateext
    dateformat _%Y-%m-%d
    #不采用压缩
    #compress
    #delaycompress
    #文件为空时不进行转存
    notifempty
    #以指定的权限和用书属性,创建全新的日志文件,同时logrotate也会重命名原始日志文件。
    create 755 web web
    sharedscripts
    postrotate
        kill -USR1 `ps aux | grep "nginx: master process" | grep -v grep | awk '{print $2}'`
        sh /var/www/webroot/nginxlogrotate/access_log_archive.sh
    endscript
}

附日志归档脚本/var/www/webroot/nginxlogrotate/access_log_archive.sh内容:

#/bin/sh
lib_path="/var/log/nginx/archive/"
date_path="`date +%Y`/`date +%m`/`date +%d`"
path="${lib_path}${date_path}"
if [ ! -d "${path}" ]; then
    mkdir -p "${path}"
fi
chmod -R 777 ${path}
suffix_date=`date +%Y-%m-%d`
#日志列表
log_list=(ds img koubei shanghu static wl wx super m fc mantis)
#重命名日志文件
for i in ${log_list[@]};
do
    if [ -f "/var/log/nginx/access/${i}.log_${suffix_date}" ];then
        mv "/var/log/nginx/access/${i}.log_${suffix_date}" "${path}/${i}.log"
        rm -f "/var/log/nginx/access/${i}.log_${suffix_date}"
    fi
done


配置完成这些以后,还有一个很关键的配置文件,/etc/anacrontab,内容如下:

wKiom1eJ4nTQxFSsAAMjem4mNjk053.png-wh_50

标红处我将定时任务运行的时候改为0=23点,然后自定义cron.daily的执行时间为每天的23:59,如此这般每天即可成功运行。

二、shell脚本

#!/bin/bash
#设置日志文件存放目录
log_path="/usr/local/nginx/log/"
#设置pid文件
pid_path="/usr/local/nginx/nginx.pid"
#日志列表
log_list=(ds img koubei shanghu static wl wx super m fc)
#重命名日志文件
for i in ${log_list[@]};
do
    #echo ${log_path}${i}_$(date -d "yesterday" +"%Y%m%d").log
    mv ${log_path}${i}.log ${log_path}${i}_$(date -d "yesterday" +"%Y%m%d").log
done
#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`


然后创建定时任务即可,定时任务可以参考我之前的文章
crontab妙用