nginx日志分割详解(三个实例)

发布时间:2020-10-25编辑:脚本学堂
本文介绍下,在nginx中对nginx日志进行分割的几种方法,包括手动分割nginx日志、shell脚本自动分割nginx日志、对大文件日志的切割技巧等,感兴趣的朋友可以参考下。

本节内容:
几种切割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

简单实现:
 

复制代码 代码示例:
[root@jbxue sh]# vi nginx_access_log.sh
#!/bin/bash
log_path="/usr/local/nginx/logs/"
mv ${log_path}access.log ${log_path}access_$(date -d "yesterday" +%Y%m%d).log
nginx_pid=`ps aux |grep -E 'nginx: master process'|grep -v 'grep'|awk '{print $2}'`
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日志配置
 

复制代码 代码示例:
access_log access_log /data/access_log_pipe main;

2、首先,创建一个命名管道
 

复制代码 代码示例:
mkfifo /www/log/access_log_pipe

3、配置cronolog:
 

复制代码 代码示例:
nohup cat /data/access_log_pipe | /usr/local/sbin/cronolog /data/log/domain.access_%Y%m%d%H%M.log &

4、启动Nginx
 

复制代码 代码示例:
/usr/local/nginx/sbin/nginx

注意:
cronolog必须在nginx启动前启动。没有安装cronolog的话,需要先安装
 

复制代码 代码示例:
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
 make
make install

方式二:
定时任务中每小时添加定时任务,执行一下脚本,可以实现小时日志分割
 

复制代码 代码示例:
log_dir="/var/log/nginx"
date_dir=`date +%Y/%m/%d/%H`
/bin/mkdir -p ${log_dir}/${date_dir} > /dev/null 2>&1
/bin/mv ${log_dir}/access.log   ${log_dir}/${date_dir}/access.log
kill -USR1 `cat /opt/nginx/logs/nginx.pid`

方式三:
使用logrotate做nginx日志轮询,这也是很多nginx配置教程中力荐的日志切割方法。

logrotate实现日志轮询,只把任务配置放在/etc/logrotate.d/下,任务就会自动完成,而且无需安装,系统自带,推荐使用.
vi /etc/logrotate.d/nginx 
 

复制代码 代码示例:
/usr/local/nginx/logs/www.jb200.com.log /usr/local/nginx/logs/nginx_error.log {
notifempty
daily
sharedscripts
postrotate
/bin/kill -USR1 `/bin/cat /usr/local/nginx/nginx.pid`
endscript
}

多个日志以空格分开,
notifempty 如果日志为空则不做轮询
daily 每天执行一次
postrotate 日志轮询后执行的脚本
这样,每天都会自动轮询,生成nginx.log.1-n 

小结:
测试时,新建线程组:线程数200,循环150,新建http请求,请求nginx上的图片,请求30000次,失败326次,后台形成5个文件,行数如下:
  

2868 access_201112182030.log
   7777 access_201112182031.log
   7626 access_201112182032.log
   7873 access_201112182033.log
   3530 access_201112182034.log
  29674 total

并没有因为切分文件而丢失日志。

三,每天自动分割Nginx日志文件
首先,创建日志分割脚本。
1、登录SSH,创建cut_logs.sh文件
vi /root/cut_logs.sh

2、粘贴下面代码到cut_logs.sh,并保存
 

复制代码 代码示例:
#!/bin/bash
# The Nginx logs path
logs_path="/home/wwwlogs/"
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}www.juzihc.com.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/juzihc_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

3、添加cut_logs.sh执行权限
 

复制代码 代码示例:
chmod +x /root/cut_logs.sh

4、设置cut_logs.sh启动时间

执行命令crontab -e进入编辑状态,添加以下代码,设置为每天0点01分启动:
01 00 * * * /root/cut_logs.sh
这样每天定时分割日志文件就设置成功了。
对于日志文件占太多空间的情况,还可以执行压缩tar,并设置删除多少天前的日志文件,这个大家有空的话,可以自行研究下。