对于一些访问量很大的网站来说,每天 access.log 访问日志会很大,可能几百兆;那么一个月下来就可能是几个 GB 的文本数据,单文件太大,不易分析。我们需要将日志文件按照天进行切割。
下面将演示我们使用手工的方式去分隔日志,如下:
# 查看日志文件列表 [root@S0 logs]# ll total 36 -rw-r--r--. 1 root root 26875 Jul 6 01:02 access.log -rw-r--r--. 1 root root 1106 Jul 6 01:02 error.log -rw-r--r--. 1 root root 6 Jul 5 02:21 nginx.pid # 查看每个日志文件的大小 [root@S0 logs]# du -sh * 28K access.log 4.0K error.log 4.0K nginx.pid # 备份日志文件,添加当前年月日前缀 [root@S0 logs]# mv access.log `date +%F -d -1day`_access.log [root@S0 logs]# ll total 36 -rw-r--r--. 1 root root 26875 Jul 6 01:02 2018-07-05_access.log -rw-r--r--. 1 root root 1106 Jul 6 01:02 error.log -rw-r--r--. 1 root root 6 Jul 5 02:21 nginx.pid # 使用 nginx 命令的 -s 参数发送 reopen 信号 [root@S0 logs]# /usr/local/nginx/sbin/nginx -s reopen # 然后使用浏览器访问 nginx,生成一个新的 access.log [root@S0 logs]# ll total 40 -rw-r--r--. 1 root root 26875 Jul 6 01:02 2018-07-05_access.log -rw-r--r--. 1 nobody root 950 Jul 6 01:26 access.log -rw-r--r--. 1 nobody root 1167 Jul 6 01:26 error.log -rw-r--r--. 1 root root 6 Jul 5 02:21 nginx.pid
其实,这种做法并没有错。但是,我们是不是需要一个人员每天来手动来执行这些操作。有些聪明的人会说“可以使用shell脚本,然后写一个定时任务来完成”。
下面是编写的一个日志备份的shell脚本,脚本文件名称为 backup.sh。如下:
#!/bin/bash LOGS_PATH=/usr/local/nginx/logs/bak CUR_LOGS_PATH=/usr/local/nginx/logs YESTERDAY=$(date +%F -d -1day) # 备份访问和错误日志 mv $CUR_LOGS_PATH/access.log $LOGS_PATH/${YESTERDAY}_access.log mv $CUR_LOGS_PATH/error.log $LOGS_PATH/${YESTERDAY}_error.log # 根据PID发送重新打开日志信号 kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
创建备份目录 bak,如下:
[root@S0 logs]# mkdir bak
执行备份脚本,如下:
[root@S0 logs]# sh backup.sh [root@S0 logs]# ll bak/ total 8 -rw-r--r--. 1 nobody root 950 Jul 6 01:26 2018-07-05_access.log -rw-r--r--. 1 nobody root 1167 Jul 6 01:26 2018-07-05_error.log
如果你不想每天都执行 backup.sh 脚本,可以使用 crontab 添加一个定时任务,在每天的凌晨执行。如下:
# 编辑 crontab [root@S0 logs]# crontab -e # 查看添加成功 crontab [root@S0 logs]# crontab -l 0 0 1 * * /bin/bash /usr/local/nginx/logs/backup.sh