本节内容:
几种切割nginx日志的方法
一、Nginx日志按天分割
使用kill -URS1的方式切割nginx日志的方式,是简单而正确的。
查看了下系统自带的logrotate来实现nginx的日志分割,查看其bash源码,发现也是发送USR1这个信号。
解释:
USR1这个用户自定义信号,ubuntu下大部分进程对这个信号的反应都是重新生成日志文件,并且不会对当前的进程产生任何其它的影响。
这里要介绍下的nginx日志切割的方法,其实现思路为:
1、使用bash的数组和for简化日志备份代码。
2、使用date函数做日志备份的后缀,达到按天分割的效果。
3、使用USR1信号让nginx产生新的日志。
例子,切割nginx日志的shell/ target=_blank class=infotextkey>shell脚本。
由于备份的日志文件分布在不同的目录下,此脚本是优化后的版本,经久耐用,呵呵。
#!/bin/bash
# site: www.jb200.com
#1.nginx日志存放路径
first_path="/var/log/nginx/first"
path_array=($first_path)
#2.日志标识前缀数组
first_prefix_sign="first"
prefix_array=($first_prefix_sign)
#3.日志成功错误标识后缀数组
bool_array=("access" "error")
#4.nginx日志切割备份后缀
postfix=`date -d '+0 days' +%Y%m%d`".log"
#5.备份当前的日志文件,重命名改为日期后缀
for path in ${path_array[*]}
do
for prefix in ${prefix_array[*]}
do
for bool in ${bool_array[*]}
do
file=$path/$prefix.$bool.log
backfile=$path/$prefix.$bool.$postfix
echo $file
echo $backfile
if [ -e $file ]
then
mv $file $backfile
fi
done
done
done
#6.查找nginx进程号,让其产生新的日志文件
nginx_pid=`ps -aux |grep -E 'nginx: master process'|grep -v 'grep'|linuxjishu/13830.html target=_blank class=infotextkey>awk '{print $2}'`
#USR1:Reopen log files,刷新nginx日志文件
kill -USR1 $nginx_pid
简单实现:
然后,在linux计划任务中添加每天执行一次的任务。
命令:crontab -e
添加:
1 0 * * * sh /*/nginx_access_log.sh
保存即可。
测试运行:
./nginx_access_log.sh
如果每天要其自动执行的话,重启下crond服务即可。
#service crond stop
然后,启动crond服务:
service crond start
即可正常使用了。
二、Nginx大日志文件切割方法
方式一:
每分钟分割一次NGINX访问日志。
1、nginx日志配置
2、首先,创建一个命名管道
3、配置cronolog:
4、启动Nginx
注意:
cronolog必须在nginx启动前启动。没有安装cronolog的话,需要先安装
方式二:
定时任务中每小时添加定时任务,执行一下脚本,可以实现小时日志分割
方式三:
使用logrotate做nginx日志轮询,这也是很多nginx配置教程中力荐的日志切割方法。
logrotate实现日志轮询,只把任务配置放在/etc/logrotate.d/下,任务就会自动完成,而且无需安装,系统自带,推荐使用.
vi /etc/logrotate.d/nginx
多个日志以空格分开,
notifempty 如果日志为空则不做轮询
daily 每天执行一次
postrotate 日志轮询后执行的脚本
这样,每天都会自动轮询,生成nginx.log.1-n
小结:
测试时,新建线程组:线程数200,循环150,新建http请求,请求nginx上的图片,请求30000次,失败326次,后台形成5个文件,行数如下:
并没有因为切分文件而丢失日志。
三,每天自动分割Nginx日志文件
首先,创建日志分割脚本。
1、登录SSH,创建cut_logs.sh文件
vi /root/cut_logs.sh
2、粘贴下面代码到cut_logs.sh,并保存
3、添加cut_logs.sh执行权限
4、设置cut_logs.sh启动时间
执行命令crontab -e进入编辑状态,添加以下代码,设置为每天0点01分启动:
01 00 * * * /root/cut_logs.sh
这样每天定时分割日志文件就设置成功了。
对于日志文件占太多空间的情况,还可以执行压缩tar,并设置删除多少天前的日志文件,这个大家有空的话,可以自行研究下。