位置:首页 > Go > Nginx 日志轮转怎么做:用 logrotate 自动压缩并切换日志

Nginx 日志轮转怎么做:用 logrotate 自动压缩并切换日志

时间:2026-08-24  |  作者:怪兽小助手  |  阅读:0

目录

  1. 先确认系统里有 logrotate
  2. 在 /etc/logrotate.d/ 下创建 Nginx 配置
  3. 这份配置里的关键参数分别做什么
  4. 如何强制测试并确认结果

前言

在 Nginx 服务器上,访问日志和错误日志会持续增长;如果长期不处理,磁盘占用和后续排查都会变得麻烦。比较稳妥的做法是交给 logrotate 自动轮转,本文按“检查工具、写配置、理解关键参数、执行测试”四步梳理,读完后可以判断这套配置是否适合自己的日志目录、用户权限和轮转频率。

在 Nginx 服务器上,访问日志和错误日志会持续增长;如果长期不处理,磁盘占用和后续排查都会变得麻烦。比较稳妥的做法是交给 logrotate 自动轮转,本文按“检查工具、写配置、理解关键参数、执行测试”四步梳理,读完后可以判断这套配置是否适合自己的日志目录、用户权限和轮转频率。

先确认系统里有 logrotate

大多数 Linux 发行版都会预装 logrotate。如果系统里没有,再用包管理器安装即可,常见方式包括 apt-getyum

确认完工具存在后,就可以单独给 Nginx 建一份轮转规则,避免和其他服务混在一起管理。

在 /etc/logrotate.d/ 下创建 Nginx 配置

先创建配置文件:

sudo touch /etc/logrotate.d/nginx

然后把下面这段内容写入文件:

/var/log/nginx/*.log {
daily
missingok
compress
delaycompress
notifempty
create 0640 www-data 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/*.log 用来指定参与轮转的日志文件;daily 表示每天轮转一次。如果业务量不大,也可以按需要改成 weeklymonthly

Nginx 日志轮转测试结果流程图
手动测试后的结果检查手动执行一次 `logrotate -f`,可以直接验证旧日志是否被压缩、新日志是否成功创建。
Nginx 日志轮转配置结构示意图
Nginx 日志轮转配置结构图把常用 logrotate 选项拆成四组,更容易检查路径、频率、压缩和重开日志是否配置到位。

避免无意义报错和空轮转

missingok 的作用是日志文件不存在时直接跳过,避免报错;notifempty 表示空日志不轮转,减少无用文件。

压缩与延迟压缩

compress 会把轮转后的旧日志压缩成 .gz 文件,节省磁盘空间。delaycompress 则会把压缩动作推迟到下一轮,这样刚被切走的上一份日志不会立刻压缩,更适合还可能被后续流程读取的场景。

新日志文件权限与后置脚本

create 0640 www-data adm 表示轮转后立即创建新的日志文件,权限为 0640,属主是 www-data,属组是 adm。这里的用户和用户组要和你的 Nginx 实际运行身份匹配,否则新日志文件可能无法正常写入。

sharedscripts 表示即使匹配到多个日志文件,也只执行一次 postrotate 脚本。后面的脚本会检查 /var/run/nginx.pid 是否存在;如果存在,就执行:

kill -USR1 `cat /var/run/nginx.pid`

这一步很关键。它会向 Nginx 主进程发送 USR1 信号,通知 Nginx 重新打开日志文件,这样后续日志才能继续写入新文件,而不是仍然占着已经轮转出去的旧文件。

如何强制测试并确认结果

配置保存后,可以先手动触发一次:

sudo logrotate -f /etc/logrotate.d/nginx

-f 表示强制执行一次轮转,不等待既定周期。执行成功后,通常能看到两类结果:旧日志被处理并压缩为 .gz 文件,同时原位置生成新的空日志文件,供 Nginx 继续写入。

后续只要系统的 logrotate 定时任务正常运行,这套规则就会按设定频率自动生效;需要临时手动执行时,仍然可以继续使用同一条 sudo logrotate -f /etc/logrotate.d/nginx 命令。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多