Nginx日志切割,按天切割nginx日志
时间:2026-10-7 07:49 作者:emer 分类: 无
前言
Nginx 的访问日志一直写在一个文件里,越写越大,几百GB都有可能。磁盘满了网站就挂了。本文讲一下怎么用 logrotate 自动按天切割 Nginx 日志。
为什么要切割日志
- 日志太大占磁盘
- 分析大文件慢
- 出问题查日志不方便
方法一:用系统自带的 logrotate
CentOS 自带 logrotate,直接配就行。
第一步:写配置文件
vi /etc/logrotate.d/nginx
内容:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
notifempty
create 0644 www www
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
参数说明:
| 参数 | 说明 |
|---|---|
daily |
按天切割 |
rotate 30 |
保留30天的日志 |
compress |
压缩旧日志 |
notifempty |
空文件不切割 |
missingok |
日志文件不存在不报错 |
第二步:测试一下
logrotate -d /etc/logrotate.d/nginx
-d 是调试模式,不会真执行,看一下有没有报错。
第三步:立即执行一次
logrotate -f /etc/logrotate.d/nginx
方法二:自己写脚本
不想用 logrotate,自己写个 shell 脚本:
vi /root/nginx_log.sh
内容:
#!/bin/bash
LOG_PATH=/var/log/nginx
YESTERDAY=$(date -d "yesterday" +%Y%m%d)
cd $LOG_PATH
mv access.log access_$YESTERDAY.log
mv error.log error_$YESTERDAY.log
nginx -s reopen
加执行权限:
chmod +x /root/nginx_log.sh
加到 crontab,每天凌晨执行:
crontab -e
加一行:
0 0 * * * /root/nginx_log.sh
常见坑
坑1:切割后日志不写了
把日志文件改名了,Nginx 还往旧文件写。
原因: Nginx 打开的是文件句柄,改名后它不知道。
解决: 切割后要通知 Nginx 重新打开日志文件:
nginx -s reopen
坑2:旧日志没删,磁盘还是满的
配了切割,但旧日志还留着。
原因: 没配 rotate 参数。
解决: 加上 rotate 30,自动只保留30天。
坑3:压缩太占CPU
所有日志都压缩,CPU 飙高。
解决: 错峰压缩,比如凌晨3点再压缩,或者用 delaycompress 延迟一天再压缩。
坑4:日志权限不对
切割后新日志文件属主不对,Nginx 写不了。
解决: logrotate 配置里加 create 0644 www www。
总结
推荐用 logrotate,系统自带,不用自己维护脚本。
核心配置就这些:
/var/log/nginx/*.log {
daily
rotate 30
compress
postrotate
/bin/kill -USR1 `cat /run/nginx.pid`
endscript
}
记住: 切割完一定要通知 Nginx 重新打开日志文件,不然新日志不写。
遇到问题加QQ23979811 协助处理