当网站访问量大后,日志数据就会很多,如果全部写到一个日志文件中去,文件会变得越来越大,文件大速度就会慢下来,比如一个文件几百兆,写入日志的时候,就会影响操作速度.
--进入日志目录
cd /usr/local/nginx/logs/
--重命名日志文件
[root@host1 logs]# mv access{,.$(date +%F)}.log
[root@host1 logs]# ls
access.2020-09-18.log access.log error.log nginx.pid
--发送信号,执行重命名日志文件命令后,日志目录中自动生成了一个新的'access.log'文件
/usr/local/nginx/sbin/nginx -s reopen
重命名日志文件后,'nginx'日志仍然会写入到"access.2020-09-18.log"文件中,并不会自动创建一个新的"access.log"文件
即使你手动创建了一个新的'access.log'文件,'nginx'仍然会把日志写入到重命名后的'access.2020-09-18.log''文件中
这是因为nginx进程读写日志文件时,是通过文件描述符去操作的,虽然我们修改了原'access.log'文件的文件名,但是原文件描述符与文件本身的对应关系仍然存在
所以,重命名后,我们需要让nginx重新打开一个新文件,以便将新的日志写入到新文件中
--编写脚本实现日志切割,可以配合'crontab'计划任务
[root@host1 /]# vim /nginx_logs.sh
#!/bin/bash
a_logs="/usr/local/nginx/logs/access.log"
b_logs="/usr/local/nginx/logs/access{,.$(date +%F)}.log"
if [ -f "$a_logs" ];then
mv "$a_logs" "$b_logs"
fi
/usr/local/nginx/sbin/nginx -s reopen
--配置文件
/etc/logrotate.conf 主配置文件
/etc/logrotate.d/ 子配置文件目录
--编辑子配置文件
[root@host1 /]# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/access.log {
daily
rotate 7
missingok
dateext
compress
delaycompress
notifempty
sharedscripts
postrotate
[ -e /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
--配置参数解释
/usr/local/nginx/logs/access.log 指定需要轮转处理的日志文件
daily 日志文件轮转周期,可用值为'daily/weekly/yearly'
rotate 7 轮转次数,即最多存储7个归档日志,会删除最久的归档日志
missingok 忽略错误信息
dateext 以当前日期作为命名格式
compress 轮循结束后,已归档日志使用gzip进行压缩
delaycompress 与compress共用,最近的一次归档不要压缩
notifempty 日志文件为空,轮循不会继续执行
sharedscripts 表示postrotate脚本在压缩了日志之后只执行一次
postrotate 将日志文件转储后执行的命令,以endscript结尾,命令需要单独成行
endscript 重启nginx日志服务,写入到新的文件中去,否则会依然写入重命名后的文件中
--启动'logrotate'并且指定配置文件切割
[root@host1 /]# logrotate -f /etc/logrotate.d/nginx
--验证
[root@host1 /]# ls /usr/local/nginx/logs/
access.log access.log-20200918 error.log logs.sh nginx.pid
'USR1'信号是为了告诉'nginx'进程重新打开日志文件