nginx日志分割的三种方法

avatar 2020年1月19日18:18:53 评论 6,731 次浏览

nginx日志分割,主要是为了针对每天的日志,在进行处理时可以找到事故出现当天的日志,根据日志的状态进行修复问题。如果访问量比较大的环境中,长时间不进行分割日志,数据太大文件会出现打不开的问题。所以,因为种种原因,需要日志进行分割,分割不是针对nginx环境,其他环境也一样,我们只是使用nginx环境进行举例说明一下:

第一种使用shell脚本

使用脚本进行日志分割的思路,就是在流量低峰期的时间段,对nginx正在写入的文件进行重新命名,然后热加载以下nginx,会重新生成一个nginx日志文件,然后继续写入。看下面的脚本:

#!/bin/bash
logspath=/home/wwwlogs/  #定义日志路径
logdate=`date -d "1 day ago" +"%Y%m%d"`  #定义前一天的日期
rmlogdate=`date -d "15 day ago" +"%Y%m%d"`  #定义15天前的日期
cd $logspath								#切换目录
mv access.log access-$logdate.log			#文件重命名
mv access_json.log access_json-$logdate.log #文件重命名
/etc/init.d/nginx reload					#reload热加载一下nginx
rm -rf access-$rmlogdate.log				#删除15天前的日志
rm -rf access_json-$rmlogdate.log			#删除15天前的日志

定义前一天的日期是为了,在第二天凌晨进行日志切割,可以针对当天的日志文件命名当天的时间。定义15天前的日期是我这里只保留15天的日志,但是有些环境需要保留半年的日志,这个时候我们需要创建一个备份日志目录,然后把15天前的日志移动到备份目录即可,后面可以在加一个半年之前的日志进行删除操作。

第二种使用shell脚本

上面针对的是域名少的nginx环境中,进行的日志切割,如果我一个nginx下挂了多个域名,然后每个域名下生成了一个日志文件,在按照上面的方法进行切割,就有点太傻了,这里我们用到了一个rename命令,如果感兴趣的话可以看看: https://www.wulaoer.org/?p=792 。这种方法,主要是使用了rename进行文件批量重命名,其他流程和上面差不多,看一下下面的脚本:

#!/bin/bash
path=/home/wwwlogs/
move_name =`date -d "7 days ago" +%Y%m%d`
move_file =/home/wwwlogs/back
cd $path
rename .log `date +%Y%m%d`".json" *.log   #把.log后缀的文件修改成"*日期.json"格式
/apps/work/service/openresty/nginx/sbin/nginx -s reload
mv *$move_name.json $move_file  #把七天前的文件移动到备份目录

这里只是使用rename修改了文件后缀,这里log后缀的文件和json后缀的文件没有什么区别,所以可以忽略。查看上和log后缀的日志是一样的。

第三章使用logrotate工具

logrotate是系统自动的一个日志切割工具,分割机制和上面写的脚本一样,这里就不说了,先创建一个logrotate切割文件,

[root@wulaoer ~]# cd /etc/logrotate.d/
[root@wulaoer logrotate.d]# vim nginx
/apps/work/service/openresty/nginx/logs/*.log {  #指的是目录下所有以.log结尾的文件
 daily			#按天切割
 dateext
 dateformat %Y%m%d.json  #切割后文件后缀,不能使用log,否则会会就文件进行继续切割
 extension .log        #切割文件后缀
 create
 rotate 60           #保留天数
 notifempty
 create 0640 root root   #切割后日志权限
 sharedscripts
 prerotate
	 if [ -d /etc/logrotate.d/nginx  ]; then \   #判断切割文件
		 run-parts /etc/logrotate.d/nginx; \
	 fi \
 endscript
 postrotate
	 [ ! -f /var/nginx.pid ] || kill -USR1 `cat /var/nginx.pid`
 endscript
}

强制执行logrotate,测试一下设置的logrotate是否正常,正常之后就可以添加到定时任务里了。

[root@wulaoer ~]# logrotate -vf /etc/logrotate.d/nginx

使用定时任务执行

0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx

nginx日志切割的三种方法已经都实现了,根据自己的喜好选择不同的方法,写完脚本之后一定要做定时任务,定时任务不执行,脚本不会执行。定时任务参考:https://www.wulaoer.org/?p=763

没有了,看些其他的吧!!!!!!!!!!!!!

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: