• Nginx日志切割脚本

    Posted on 一月 9th, 2009 inetdemon No comments

    使用logrotate:

    vi /etc/logrotate.d/nginx

    /usr/local/nginx/logs/*.access.log error.log{
    daily
    missingok
    #保留365个log
    rotate 365
    compress
    #延后压缩
    delaycompress
    #无文件不压缩
    notifempty
    #创建的文件权限设置为644,用户组nobody:root
    create 644 nobody root
    #多个文件脚本轮换只执行一次
    dateext
    #在文件末尾添加当前日期
    olddir /usr/local/nginx/logs/backlog/
    #把备份文件拷贝到老目录,防止再次备份
    sharedscripts
    prerotate
    #rotate之前sleep59秒
    sleep 59
    endscript
    postrotate
    if [ -f /var/run/nginx.pid ]; then
    kill -USR1 `cat /var/run/nginx.pid`
    fi
    /usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=www.sasacity.com -dir=/app/public/awstats/data/ -lang=cn -configdir=/usr/local/awstats/wwwroot/cgi-bin/ -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
    endscript
    }
    调试脚本用
    /usr/sbin/logrotate -d /etc/logrotate.d/nginx
    使用无误后执行一下看看
    /usr/sbin/logrotate -f /etc/logrotate.d/nginx
    如果执行没有问题,编辑 /etc/crontab,把cron.daily的运行日期改到每天晚上23点59分执行(注意到我们在脚本中sleep了59秒):
    59 23 * * * root run-parts /etc/cron.daily

    这个方法的缺点是dateext无法自动定制格式,如果文件很多,我们需要放在2008/05/, 2008/06/, 2008/07/这样的目录结构,因此我编写了以下脚本,供参照:
    vi /usr/local/nginx/sbin/cut_nginx_log.sh
    logs_path="/usr/local/nginx/logs/"
    logfiles="www.access.log blog.access.log host.access.log error.log"

    server=`hostname`
    date=$(date -d "yesterday" +"%Y%m%d")
    save_path=${logs_path}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
    mkdir -p ${save_path}

    for log in ${logfile};
    do mv ${logs_path}/${log} ${save_path}/${log}.${date}.${server};
    done

    kill -USR1 `cat /var/run/nginx.pid`

    for log in ${logfile};
    do gzip ${save_path}/${log}.${date}.${server};
    done

    添加cronjob
    crontab -e
    0 0 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh

    Leave a reply