<?php

通过shell+crontab实现自动分割nginx日志

最近有几个朋友问这个事情,干脆写出来吧。。
nginx自身不能按天分割日志,因此还是自己动手来吧~
本文提供的这个脚本会把当前的log文件打包为当前日期为文件名的tgz包,并保存到指定目录。

首先把下面的脚本copy保存为/root/daily_logs.sh

#! /bin/bash

nginx_app=/home/nginx/sbin/nginx #设置nginx的目录
logs_dir=/data/logs/ #log目录
bak_dir=/data/logs/bak/ #log备份目录

#先把现有的log文件挪到备份目录临时存放
cd $logs_dir
echo "moving logs"
/bin/mv *.log $bak_dir
sleep 3

#重建nginx log
echo "rebuild logs"
echo "$nginx_app -s reopen"
$nginx_app -s reopen

#按天打包log文件
echo "begining of tar"
cd $bak_dir
/bin/tar czf `date +%Y%m%d`.tgz *.log

#删除备份目录的临时文件
echo "rm logs"
rm -f *.log
echo "done"

并添加执行权限:

chmod +x /root/daily_logs.sh

然后增加crontab,这里以每晚0点执行为例:

[root@localhost ~]# crontab -e
0 0 * * * /root/daily-task.sh > /dev/null 2>&1

保存后退出,以后就可以自动分割nginx的日志啦~

收工。。

Tags: , ,

3 Responses to “通过shell+crontab实现自动分割nginx日志”

  1. 实现nginx每日自动分割并压缩日志的方法 | 游侠海外岛 Says:

    [...] 之前在国内用合租主机的时候,服务商都会每天提供日志的压缩备份下载。有时候有什么事,查起来也方便。后来,用上了国外的VPS,而且用的是nginx。上网查了一下,据说Apache是有提供日志分割压缩功能的,但是nginx就没有。后来通过上网搜索,发现方法还是有的,找到《通过shell+crontab实现自动分割nginx日志 》,通过文中的方法,就可以非常简单地对日志进行分割并压缩了。本文对《通过shell+crontab实现自动分割nginx日志 》文章中的方法进行了一点点的修改,主要是给access.log和nginx_error.log两个文件在文件名前面加上日期,方便以后大批量日志解压出来的时候分析使用的。 [...]

  2. 和煦 Says:

    这个方法与网上大多不一样,为什么没有使用reload而是使用了reopen呢?

  3. zhys9 Says:

    reopen信号是重新日志文件,相对reload消耗更小一些。
    通过nginx的帮助信息可以看到该参数

    [zhys9@localhost c]# /home/nginx/sbin/nginx -h
    nginx version: nginx/0.8.49
    Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]

    Options:
    -?,-h : this help
    -v : show version and exit
    -V : show version and configure options then exit
    -t : test configuration and exit
    -s signal : send signal to a master process: stop, quit, reopen, reload
    -p prefix : set prefix path (default: /home/nginx/)
    -c filename : set configuration file (default: conf/nginx.conf)
    -g directives : set global directives out of configuration file

Leave a Reply