温馨提示×

nginx日志怎么清理

小樊
50
2026-07-07 15:10:23
栏目: 编程语言

清理 nginx 日志常见有几种方式,按「是否保留历史、是否自动清理」给你一个完整说明。


一、手动清理(不推荐长期使用)

1️⃣ 直接删除日志(不推荐)

rm -f /var/log/nginx/access.log
rm -f /var/log/nginx/error.log

⚠️ 风险:nginx 可能仍然占用文件句柄,日志不会立刻释放磁盘空间。


2️⃣ 清空日志文件(推荐)

> /var/log/nginx/access.log
> /var/log/nginx/error.log

或:

truncate -s 0 /var/log/nginx/access.log

✅ 好处:不删除文件,nginx 可继续写入。


二、正确方式:日志轮转(强烈推荐 ✅)

使用 logrotate(最标准做法)

1️⃣ 查看 nginx 的 logrotate 配置

cat /etc/logrotate.d/nginx

常见配置示例:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        systemctl reload nginx
    endscript
}

2️⃣ 参数说明

参数 含义
daily 每天轮转
rotate 30 保留 30 天
compress 压缩旧日志
notifempty 空文件不轮转
postrotate 轮转后 reload nginx

手动触发一次 logrotate

logrotate -f /etc/logrotate.d/nginx

三、nginx 热加载(避免重启)

清理或轮转日志后,一定要让 nginx 重新打开日志文件:

nginx -s reload
# 或
systemctl reload nginx

否则可能出现:

  • 日志不写入
  • 磁盘空间不释放

四、只保留最近 N 天日志(自动清理)

示例:删除 30 天前的日志

find /var/log/nginx -name "*.log" -mtime +30 -delete

可加入 crontab:

0 3 * * * find /var/log/nginx -name "*.log" -mtime +30 -delete

五、关闭不需要的日志(减少日志量)

1️⃣ 关闭 access 日志

access_log off;

2️⃣ 降低 error 日志级别

error_log /var/log/nginx/error.log warn;

六、常见问题

❓ 删了日志但磁盘没释放

lsof | grep deleted

解决:

systemctl reload nginx

❓ docker 中的 nginx 日志

truncate -s 0 $(docker inspect --format='{{.LogPath}}' 容器名)

✅ 推荐方案总结

场景 推荐方式
生产环境 logrotate
临时清理 truncate
控制日志大小 日志级别 + 轮转
自动化 cron + logrotate

如果你愿意,可以告诉我:

  • 系统(CentOS / Ubuntu / Docker)
  • nginx 版本
  • 磁盘占用情况

我可以帮你定制一套最合适的清理方案。

0