您的位置:首页 > 运维架构 > Nginx

nginx日志切割

2017-01-05 00:00 387 查看
背景:上线了好几个月,nginx加上了健康检查模块,所以每次在重启服务,如果没有切换nginx,或者节点挂掉的时候,会产生大量的error日志,昨天发现error日志有270M,就一个文件,也没做切割,整个文件臃肿,不利于查找归类。

在网上查了几种日志分割的方法,第一种说是新版nginx可以自动按照access.1.log,access.2.log……这样自动分割,再找了一下资料,其实是用logrotate进行日志分割的。服务器本身是有logrotate,但是用的是root权限,本人没root权限,故不考虑此方案。

第二种是写shell脚本,利用crontab定时任务分割。脚本如下

#!/bin/bash
#设置日志文件存放目录
logs_path="/app/nginx/logs/"
#设置pid文件
pid_path="/app/nginx/logs/nginx.pid"
#重命名日志文件
mv ${logs_path}error.log ${logs_path}error_$(date -d "yesterday" +"%Y%m%d").log
#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`

再在0点0分执行就可以了.

0 0 * * * sh /app/shell/rotate_nginx_log.sh

解决完第一个问题,日志分割,现在有第二个问题,270M的日志文件怎么处理?我想整理归类,网上找了一圈,发现cronolog也是可以用来分割日志的,但是必须在重启后,基本上也是处理以后的日志,对于以前的日志处理没啥帮助,于是自己写了个脚本处理日志。脚本如下

#!/bin/bash
file="/app/nginx/logs/error.log"
outfile="/app/nginx/logs/error_"
last_d=0
d=0
while read line
do
if [ -n "$line" ]; then #非空
d=${line:0:10} #nginx默认格式,取日期,比如2016/11/11
d=${d//'/'/''} #去掉/
if [ $last_d = 0 ]; then
last_d=$d
fi
if [ $last_d != $d ]; then
last_d=$d
fi
echo $line >> $outfile$d'.log'
fi
done < $file
echo "split done!!!"

思路就是把按照日期把日志写到对应的日志文件。

再之后,就是日志的归档整理问题了。一样写了个脚本,把日志压缩,存到备份目录,删掉原来的文件,大功告成。这里有3个地方有日志要处理,就写了个数组形式,需要处理的再加。

#!/bin/bash
log_path=("/app/log/" "/app/log/order/" "/app/nginx/logs/")
bak_path="bak/"
proj_name=("app1" "app2" "error")
d1=`date -d '5 months ago' '+%Y-%m'`
d2=`date -d '5 months ago' '+%Y%m'`
d=($d1 $d1 $d2)
size=${#log_path[*]}
for((i=0;i<size;i++)); do
echo -e "cd ${log_path[$i]}"
cd ${log_path[$i]} #进入目录
echo -e "tar -czf ${proj_name[$i]}-${d[$i]}.tar.gz *${proj_name[$i]}*${d[$i]}*.log"
tar -czf ${proj_name[$i]}-${d[$i]}.tar.gz *${proj_name[$i]}*${d[$i]}*.log #压缩
echo -e "mv ${proj_name[$i]}-${d[$i]}.tar.gz ${log_path[$i]}$bak_path"
mv ${proj_name[$i]}-${d[$i]}.tar.gz ${log_path[$i]}$bak_path #移到备份目录
echo -e "rm ${log_path[$i]}*${proj_name[$i]}*${d[$i]}*.log"
rm ${log_path[$i]}*${proj_name[$i]}*${d[$i]}*.log #删除文件
echo ""
done
echo "done!!!"

之后就类似的crontab 定时任务了,这里就不写了,现在这个模式是一个月执行一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息