【www.bbyears.com--nginx】
每天自动nginx日志切割脚本
代码如下[bash]
#!/bin/bash
#先把日期赋值到变量,因为是在第二天0点后执行,所以日期应该获取前一天的,如20120903
todaydate=`date –date=’yesterday’ "+%Y%m%d"`
#把网站的子目录日志枚举一下
for site in `ls -l /home/log/ | grep -v "^d" |awk ‘{print $NF}’`
#移动昨天的日志到新的位置,重命名中增加日期标识
do
mv /home/log/$site /home/logbak/$site-$todaydate
done
#找到nginx的master进程,向它发USR1指令,让它往新的日志文件写入,如果不加这条命令的话,仍会往刚重命名的日志中写入
kill -USR1 `ps aux | grep nginx | grep master | awk ‘{print $2}’`[/bash]
每7天对日志进行一下切割
说明:每隔7天执行一次,使用crontab自动运行脚本,请根据自己的需要修改代码中的111cn.net
#!/bin/bash
#Nginx 日志路径
logs_path="/home/wwwlogs/"
mkdir -p ${logs_path}$(date -d -7day +"%Y")/$(date -d -7day +"%m")/
mv ${logs_path}111cn.net.access.log ${logs_path}$(date -d -7day +"%Y")/$(date -d -7day +"%m")/domain.com.access_$(date -d -7day +"%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/logs/nginx.pid`
再看一个计划任务
代码如下#nginx日志切割脚本
#!/bin/bash
#设置日志文件存放目录
logs_path="/usr/local/nginx/logs/"
#设置pid文件
pid_path="/usr/local/nginx/nginx.pid"
#重命名日志文件
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`
保存以上脚本nginx_log.sh,并设置定时切割任务
三、定时工作
在crontab中设置作业
0 0 * * * bash /usr/local/nginx/nginx_log.sh
支持多个域名的日志文件
以根据需要改变成自己喜欢的日志保存格式,我这里的日志保存方式是:按照年月来创建文件夹,每日日志文件添加年月日的后缀形式,比如:/var/log/2013/11/letuknowit_20131110.log
#!/bin/bash
# 日志文件保存的位置
logs_path="/alidata/log/nginx/access/"
# 需要切割的日志文件名,多个文件用空格隔开
logs_name=(xxx)
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y/%m")
num=${#logs_name[@]}
for((i=0;i
done
kill -USR1 `cat /alidata/server/nginx/logs/nginx.pid`
上面的xxx换成自己的日志文件名,如果有多个日志文件,用空格隔开,比如主站的日志文件为letu.log,二级域名的日志文件为blog.log,则logs_name如下:
代码如下logs_name=(letu blog)
日志名一般在nginx的配置文件中进行设置,如下面的设置
代码如下
log_format letu "$remote_addr - $remote_user [$time_local] "$request" "
"$status $body_bytes_sent "$http_referer" "
""$http_user_agent" "$http_x_forwarded_for"";
access_log /alidata/log/nginx/access/letu.log letu;