72人参与 • 2026-08-29 • https
/etc/logrotate.d/ 下的规则文件)daily、rotate、compress、delaycompress、missingok、notifempty、create、postrotatesystemctl start nginx
for i in {1..100}; do curl -s http://127.0.0.1 > /dev/null; done
wc -l /var/log/nginx/access.log输出: 101 行——这就是轮转的"原料"。
vim /etc/logrotate.d/nginx
/var/log/nginx/access.log /var/log/nginx/error.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -usr1 `cat /var/run/nginx.pid`
fi
endscript
}
logrotate -d /etc/logrotate.d/nginx
看到 considering log /var/log/nginx/access.log 说明配置没问题。
logrotate -f /etc/logrotate.d/nginx ls -lh /var/log/nginx/

| 现象 | 对应参数 | 说明 |
|---|---|---|
| 新的 access.log 属主是 nginx:adm、权限 -rw-r--r-- | create 644 nginx adm | 轮转后按指定权限属主重建日志 ✅ |
| access.log.1 还是 9.0k、没变 .gz | delaycompress | 等下一次轮转才压缩 ✅ |
| error.log 是空的、没有 error.log.1 | notifempty | 空日志不轮转 ✅ |
logrotate -f /etc/logrotate.d/nginx ls -lh /var/log/nginx/

现象: 输出一模一样,什么都没发生。
原因: 第一次轮转后新 access.log 是空的(0 字节),notifempty 检查到空日志直接跳过——再次验证 notifempty 在工作。
for i in {1..50}; do curl -s http://127.0.0.1 > /dev/null; done
wc -l /var/log/nginx/access.log # 输出:50
logrotate -f /etc/logrotate.d/nginx
ls -lh /var/log/nginx/
效果: 之前 9.0k 的日志被压缩成 158 字节(压缩率 98%),compress 实锤生效。
| 文件 | 说明 |
|---|---|
| access.log(空,nginx:adm) | create 新建的当前日志 |
| access.log.1(4.5k,未压缩) | delaycompress:等下次才压缩 |
| access.log.2.gz(158 字节) | compress:上上次的已压缩 |
| error.log(空) | notifempty:一直跳过 |
for i in {1..8}; do
echo "log line $i" >> /var/log/nginx/access.log
logrotate -f /etc/logrotate.d/nginx
done
ls /var/log/nginx/ | grep access
预期: 只看到 access.log + access.log.1 ~ access.log.7.gz,没有 .8——最旧的一份被自动删除,rotate 7 生效。
curl -s http://127.0.0.1 > /dev/null tail -n 2 /var/log/nginx/access.log
能看到新访问记录写入 access.log,说明 kill -usr1 让 nginx 重新打开了新日志文件。
cat /etc/cron.daily/logrotate
logrotate 每天凌晨由 cron 自动执行——配置写好就不用管了。
| 参数 | 验证证据 |
|---|---|
| daily | 配置中声明,cron 每天触发 |
| rotate 7 | 循环 8 次后只有 7 份历史 |
| compress | 9.0k → 158 字节 |
| delaycompress | .1 保持未压缩 |
| missingok / notifempty | 空日志跳过(error.log) |
| create 644 nginx adm | 新日志属主 nginx:adm、权限 644 |
| postrotate | 轮转后 curl 仍写入 access.log |
1. logrotate 的本质:
日志轮转 = 触发 → 检查 → 改名 → 压缩 → 通知服务 → 清理,每天自动循环一次,让磁盘只保留最近 n 份日志。
2. 参数记忆口诀:
3. 踩过的两个坑(也是知识点):
4. 运维意义:
日志不管理的下场是磁盘被撑爆、业务中断;配置一次 logrotate,就能永久自动化——用最小的成本,避免最大的事故。
到此这篇关于nginx 日志自动轮转(logrotate)的文章就介绍到这了,更多相关nginx 日志自动轮转内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论