对于一些访问量很大的网站来说,每天 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