原理
利用定时任务+脚本,实现日志的自动切割。
准备工具
操作系统:CentOS 7
Nginx版本: 1.13.1
Nginx安装目录:/application/nginx
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$ /application/nginx/sbin/nginx -v
nginx version: nginx/1.13.1
默认情况Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志个头很大,不利于日志的分析和处理,因此,有必要对Nginx日志、按天或按小时进行切割,使其分成不同的文件保存。这里使用按天切割的方法。
切割脚本内容如下
$ cat /server/script/cut_nginx_log.sh
#! /bin/bash
Dateformat=`date -d yesterday +"%Y%m%d"` #可以省略双引号
Basedir='/application/nginx'
Nginxlogdir="/application/nginx/logs"
Logname='access'
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload
/bin/mv www_access.log www_access$(date +%F -d -1day).log
注意:
脚本实现切割Nginx日志的思想为将写入的Nginx日志(access.log)改名为带日期的格式文件(年年年月月日日_access.log),然后平滑重新加载Nginx,生成新的
Nginx日志(access.log)。
通过定时任务实现每天00点整定时执行/server/script/cut_nginx_log.sh切割日志。将Nginx日志修改为带昨天日期的文件。
# cat >> /var/spool/cron/root << EOF
> #cut nginx access log by 某某人
> 00 00 * * * /bin/sh /server/script/cut_nginx_log.sh > /dev/null 2>&1
> EOF
操作后结构如下
[root@sy-pc ~]# crontab -l
#cut nginx access log by 某某人
00 00 * * * /bin/sh /server/script/cut_nginx_log.sh > /dev/null 2>&1
最终日志切割效果如下
[root@sy-pc ~]# ll /application/nginx/logs/
total 72
-rw-r--r--. 1 root sy 1606 Jul 31 16:02 20190730_access.log
-rw-r--r--. 1 root sy 61104 Jul 31 15:58 20190731_access.log
-rw-r--r--. 1 root sy 0 Jul 31 16:02 access.log
-rw-r--r--. 1 root sy 241 Jul 31 16:02 error.log
-rw-r--r--. 1 root sy 5 Jul 31 13:28 nginx.pid
删除 更改日期7天前的日志。
find /application/nginx/logs -mtime +7 -type f -name \*.log | xargs rm -rf
CentOS 7
systemctl status crond #查看定时任务状态
systemctl stop crond #关闭定时任务
systemctl start crond #开启定时任务
Nginx常用的日志收集及分析工具有rsyslog、awstats、flume、ELK(Elasticsearch logstash Kibana)、storm等。如果读者有需求,可以自行研究或参考老男孩的其他课程、书籍或网上资料。更多常用的开源运维工具见 http://oldboy.blog.51cto.com/2561410/775056
参考文献
[1] 老男孩. 跟老男孩学Linux运维:Web集群实战[M]. 机械工业出版社,2016-03-01.
[2] nginx切割日志[DB|OL]. https://www.cnblogs.com/jsonhc/p/8120520.html
[3] linu查找find命令及删除7天前的文件[DB|OL]. https://blog.csdn.net/ak57193856/article/details/78251611