cronolog实现nginx日志分钟切割,自定义nginx日志格式实现统计

说明:
应公司需求,需要将nginx访问日志按分钟切割。这里参照网上的做法,通过cronolog将nginx产生的访问日志实时传入到pipe中。为了便于统计,自定义nginx访问日志格式。

实现:
1.crontab编译安装

wget http://cronolog.org/download/cronolog-1.6.2.tar.gz   //此版本已经是最新的,就更新到2002
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make
make install

 
2.自定义nginx格式,,以||分隔:

vim /usr/local/webserver/nginx/conf/nginx.conf  //以下为内容
log_format  access  '$remote_addr||$remote_user||[$time_local]||"$request"'
              '||$status||$body_bytes_sent||"$http_referer"'
              '||"$http_user_agent"||$http_x_forwarded_for';
//此log_format一定要放在server{}前面,http{}里面。如果是按vhosts的形式来存储,请将log_format要放在server{}前面
//相应的日志位置调用日志格式,并将日志写入管道。同一地址,可填定多条access_log。
access_log  /var/log/nginx/nobody_access_min.pipe  access;
access_log  /var/log/nginx/nobody_access_hour.log  access;   //此条access_log用于比对分钟切割产生的日志,确定是否有记录损失

 
3.创建日志管道

mkfifo /var/log/nginx/nobody_access_min.pipe

 
4.添加脚本,实现以日期创建文件夹,内含00,01…..23文件,用于存放nobody.com的access日志

vim /tmp/nginx_log_mkdir_day.sh  //以下为内容
#!/bin/bash
logs_path="/var/log/nginx/"
date_dir=`date +%Y%m%d`
for i in `seq -w 0 23`;
do
  /bin/mkdir -p ${logs_path}${date_dir}/$i;
done

 
5.编辑crontab,添加以下信息:实现按天建目录,按小时切割日志

crontab -e
00 00 * * * /bin/bash  /tmp/nginx_log_mkdir_day.sh
00 */1 * * * /bin/bash  /tmp/nginx_log_hour_cut.sh   //此条,之前做日志小时切割时已经添加。

 
6.运行cronolog,每当有访问数据时,将nobody_access_min.pipe中的访问数据写进nobody_access_%Y%m%d%H%M.log

nohup cat /var/log/nginx/nobody_access_min.pipe | nohup /usr/local/sbin/cronolog /var/log/nginx/%Y%m%d/%H/nobody_access_%Y%m%d%H%M.log &
//管道前后是两个命令,因此当我们关闭终端时,会发现cronolog也跟着消失了。所以需要两个nohup,而不是下面的命令:
nohup cat /var/log/nginx/nobody_access_min.pipe | /usr/local/sbin/cronolog /var/log/nginx/%Y%m%d/%H/nobody_access_%Y%m%d%H%M.log &

 
7.启动Nginx,若nginx已启动,可以通过/usr/local/webserver/nginx/sbin/nginx -s reload来重启

/usr/local/webserver/nginx/sbin/nginx -t  //测试nginx配置是否正确
/usr/local/webserver/nginx/sbin/nginx

 
8.设置开机启动,并指定后台执行

vim /etc/rc.local    //在末尾添加以下信息
nohup cat /var/log/nginx/nobody_access_min.pipe | nohup /usr/local/sbin/cronolog /var/log/nginx/%Y%m%d/%H/nobody_access_%Y%m%d%H%M.log &
ulimit -SHn 65535
echo 67108864 >/proc/sys/kernel/shmmax
/usr/local/webserver/php/sbin/php-fpm
/usr/local/webserver/ngnix/sbin/nginx
/data/mysql/3306/mysqld start

 
9.数据对比,确定日志记录是否有丢失

wc -l /var/log/nginx/20121112/16/nobody_access_201211121*
wc -l /var/log/nginx/20121112/16/nobody_access_hour_2012111216.log

 
10.重启nginx的日志进程
由于cronolog(pipe)是只有访问时,才会生成记录。因此可能需要重启nginx的日志进程,使其重新生成nobody_access_hour.log日志,便于统计。

kill -USR1 `cat /usr/local/webserver/ngnix/nginx.pid`

 
附录:
1. 管道必须在nginx启动前启动。如果nginx未运行,开启cronolog后(即管道),nginx –t做检测会中断管道。而cronolog不开启,nginx –t及启动全部会受影响。(可以通过strace 查看,没试过strace)

2. 如无特殊要求,还是建议按天通过常规计划任务reload nginx方法进行截断。如需按时甚至按分截断,可以考虑通过计划任务+脚本处理。

原文参考:
Nginx实现大日志文件切割
Nginx cronolog 配置
nginx的作者并不推荐”将日志输出到管道,然后cronolog进行切割”的做法
Nginx的平滑更改配置以及日志切割

原创文件,欢迎转载,转载请保留 cronolog实现nginx日志分钟切割,自定义nginx日志格式实现统计 或 http://www.gaingreat.com/190.html

发表评论

邮箱地址不会被公开。 必填项已用*标注