Nginx日志自动切割神器
背景:发现nginx日志文件过大:50g一个文件,手动切割都要半天
centos7
压测环境 大量压测请求,nginx日志过于庞大,一开始是写了一份shell脚本进行日期匹配自动切割日志。
考虑到不同的环境可能nginx日志格式不一样,匹配规则需要重新写。非常麻烦。
所以找到了这个方法
logrotate
使用系统自带日志切割神器logrotate
cat <<EOF >> /etc/logrotate.d/nginx
/var/log/nginx/*.log {
# create: 在日志文件轮换时创建新的日志文件,权限为 0640,属主是 nginx 用户,属组是 root 用户
create 0640 nginx root
# daily: 每天轮换一次日志文件
daily
# rotate 10: 保留最近的 10 个轮换后的日志文件
rotate 10
# missingok: 如果轮换的日志文件不存在,不会报错,直接继续进行轮换
missingok
# notifempty: 如果日志文件为空,不会进行轮换
notifempty
# compress: 轮换后的日志文件会被压缩
compress
# delaycompress: 在下一次轮换时才对上一次轮换的文件进行压缩
delaycompress
# sharedscripts: 如果有多个日志文件被轮换,只执行一次 postrotate 和 endscript 部分的脚本
sharedscripts
# 在日志文件轮换后执行的脚本
postrotate
# 发送 USR1 信号给 Nginx 进程,通知它重新打开日志文件
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
#命名格式
dateext
dateformat -%Y%m%d%H
}
EOF
效果如下
#手动触发
logrotate -f /etc/logrotate.d/nginx
#强行手动触发
logrotate -f /etc/logrotate.d/nginx
扩展
size 100M
:指定日志文件的大小阈值,当日志文件达到指定大小时进行轮换。maxsize 1G
:设置日志文件的最大大小,当超过指定大小时进行轮换。lastaction
和endscript
:与postrotate
和endscript
类似,用于在轮换之后执行用户自定义的脚本。extension .gz
:指定压缩后的日志文件的扩展名。ifempty
:即使日志文件为空也进行轮换。copytruncate
:在进行轮换时,先复制日志文件,再截断原始日志文件,适用于不能中断写入的应用程序。su user group
:指定在进行轮换操作时的用户和用户组。nocompress
:禁止对日志文件进行压缩。olddir /var/nginx/old
:指定存放旧日志文件的目录。rotate 5
:指定轮换周期的倍数,例如rotate 5
表示每5个周期进行一次轮换。compresscmd /usr/bin/gzip
:指定用于压缩日志文件的压缩命令。uncompresscmd /usr/bin/gunzip
:指定用于解压缩日志文件的解压缩命令。dateext
:在压缩后的日志文件名后添加一个日期后缀。dateformat
:指定日期后缀的格式。createolddir
:如果指定的旧日志目录不存在,将会创建。sharedscripts
:如果有多个日志文件被轮换,只执行一次postrotate
和endscript
部分的脚本。