一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中日志切割如何配合 rotatelogs 模块实现高效的日志归档

时间:2026-08-27 11:47:49 编辑:袖梨 来源:一聚教程网

Nginx本身不支持按日期自动滚动日志,需借助logrotate或rotatelogs等外部工具实现;推荐使用logrotate配置daily轮转、USR1重载,并设置rotate 30、compress等策略确保日志按天归档与清理。

Nginx 本身不内置日志轮转功能,需借助外部工具(如 rotatelogs)实现按时间或大小自动切割、压缩与归档。配合得当,可避免单个日志文件无限增长、提升排查效率,并减少磁盘压力。

rotatelogs 的工作原理与优势

rotatelogs 是 Apache 提供的通用日志切割工具,Nginx 可通过管道(|)将 access_log 或 error_log 实时转发给它处理。它支持按时间(如每小时、每天)或文件大小(如 100M)触发轮转,自动重命名旧日志(带时间戳)、保留指定数量备份,并可调用脚本执行压缩等后续操作。

  1. 不依赖 crontab 定时任务,无切割窗口期丢失日志的风险
  2. 切割过程对 Nginx 透明,无需 reload 或 reopen 操作
  3. 时间戳格式灵活(%Y%m%d%H%M%S),便于按日期检索

在 Nginx 配置中启用 rotatelogs

修改 nginx.conf 或站点配置中的 access_log 指令,用管道连接 rotatelogs

access_log "|/usr/bin/rotatelogs -n 7 /var/log/nginx/access_%Y%m%d.log 86400" main;

说明:

  1. -n 7:最多保留 7 个历史文件(含当前)
  2. /var/log/nginx/access_%Y%m%d.log:生成带日期的日志名,如 access_20240520.log
  3. 86400:每 86400 秒(即 1 天)轮转一次
  4. main:使用名为 main 的 log_format

错误日志同理,但建议单独配置(因格式和重要性不同):

error_log "|/usr/bin/rotatelogs -n 5 /var/log/nginx/error_%Y%m%d.log 86400";

进阶技巧:按小时切割 + 自动压缩

高频访问站点适合按小时切分,避免单日志过大;同时可利用 -p 参数在轮转后执行压缩命令:

access_log "|/usr/bin/rotatelogs -n 24 -p '/bin/gzip /var/log/nginx/access_%Y%m%d%H.log' /var/log/nginx/access_%Y%m%d%H.log 3600";
  1. 3600:每小时轮转
  2. -p 后命令会在新文件生成前,对上一个已关闭的日志执行 gzip 压缩
  3. 注意路径权限:确保 nginx worker 进程(通常是 nobody 或 www-data)有写入日志目录及执行 gzip 的权限

验证与排错要点

配置完成后务必检查:

  1. 确认 rotatelogs 路径正确(可用 which rotatelogs 查看)
  2. 查看 Nginx 错误日志,若出现 open() "/dev/stdout" failed 类报错,多因权限或 SELinux 限制,可改用绝对路径并赋予对应用户读写权限
  3. 手动触发一次日志写入(如 curl 访问),观察 /var/log/nginx/ 下是否生成带时间戳的文件
  4. 运行 ps aux | grep rotatelogs,确认进程正在运行且未异常退出

不复杂但容易忽略细节,配好后基本可长期稳定运行。

热门栏目