nginx 日志切割

nginx logrotate日志切割

修改/etc/logrotate.d/nginx文件内容即可

查询nginx.pid路径

nginx -V

--pid-path后面就是pid的路径

--pid-path=/var/run/nginx.pid

按照天切割

这里如果你有多个站点需要切记都可以一直往后面加,这里只加一个/var/log/nginx/iluoy.com/

/var/log/nginx/*.log /var/log/nginx/iluoy.com/*.log { //log的位置
        su root list
        daily
        missingok
        rotate 52 
        dateext
        compress  
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

参数解析

  • /var/log/nginx/*.log /var/log/nginx/iluoy.com/*.log 需要切割的日志位置
  • su root list 使用root权限 ,如果不使用的话,可能会报权限有关的问题 后面有提到
  • daily 日志文件分割频度。可选值为 daily,monthly,weekly,yearly
  • missingok 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误
  • rotate52 一次将存储52个归档日志。对于第52个归档,时间最久的归档将被删除。//日志保存52天
  • dateext 文件后缀是日期格式,也就是切割后文件是:xxx.log-20131216.gz 这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1 这种格式
  • compress 在轮循任务完成后,已轮循的归档将使用gzip进行压缩
  • nocompress 如果你不希望对日志文件进行压缩,设置这个参数即可
  • delaycompress 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用
  • notifempty 如果日志文件为空,轮循不会进行
  • sharedscripts 表示postrotate脚本在压缩了日志之后只执行一次
  • create 644 nginx adm 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件
  • postrotate/endscript 最通常的作用是让应用重启,以便切换到新的日志文件, 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行

测试指令

  • 运行logrotate logrotate/etc/logrotate.d/nginx
  • 测试日志切割 logrotate -d /etc/logrotate.d/nginx (如果文件的时间小于一天,不会执行切割日志)
  • 强制轮询切割日志 logrotate -vf /etc/logrotate.d/nginx (为了便于我们直观的观察测试结果,建议大家手动试一下)

logrotate切分lumen日志

因为我的日志值存一个文件,方便logstash收集日志,然后用 logrotate 来切割

配置文件

/data/www/xxxx/storage/logs/lumen.log {
        su root list
        daily
        missingok
        rotate 100
        dateext
        compress
        delaycompress
        notifempty
        create 664 server server
}

执行强制切割

sudo logrotate -vf /etc/logrotate.d/point-api

切分之后日志还是写到切分之后的

  • 切分之前log lumen.log
  • 切分之后 lumen.log-20190603

按道理说 我们希望日志出现在 lumen.log 但是他却出现在 lumen.log-20190603

shell切割

将以下shell写入cut_log.sh文件

#!/bin/bash
##零点执行该脚本

##nginx日志文件所在的目录
LOGS_PATH=/var/log/nginx

##获取昨天的yyyy-MM-dd
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

##移动文件
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log

##向nginx主进程发送USR1信号,USR1信号是重新打开日志文件
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`

##删除7天前的日志(这里我们不删除)
# cd ${LOGS_PATH}
# find . -mtime +7 -name "access_*" | xargs rm -f

exit 0

2.crontab自动执行脚本

$ crontab -e
# 加入以下脚本
0 0 * * * /etc/nginx/sh/cut_log.sh

参考文章