日志切割

当网站访问量大后,日志数据就会很多,如果全部写到一个日志文件中去,文件会变得越来越大,文件大速度就会慢下来,比如一个文件几百兆,写入日志的时候,就会影响操作速度.

手动切割

--进入日志目录
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

logrotate

--配置文件
/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信号

'USR1'信号是为了告诉'nginx'进程重新打开日志文件
Last modification:January 12th, 2021 at 04:35 pm
如果觉得我的文章对你有用,请随意赞赏