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

最新下载

热门教程

Nginx 如何在日志切割脚本中配置自动清理超过保留期限的历史日志文件

时间:2026-09-01 20:41:47 编辑:袖梨 来源:一聚教程网

在Nginx日志切割脚本中集成自动清理功能,推荐用find按-mtime +30删除过期文件或通过logrotate配置rotate 7与maxage 30实现一体化管理,需限定路径深度、排除活跃日志并用cron定时执行。

在 Nginx 日志切割脚本中加入自动清理过期日志的功能,核心是用 find 命令按修改时间(或创建时间)筛选并删除旧文件,通常配合 logrotate 或自定义 shell 脚本实现。关键不是“只切分”,而是“切分后顺手清”。

使用 find 命令直接清理过期日志文件

这是最轻量、最常用的方式,适合集成在你的日志切割脚本末尾(比如每天执行的 nginx_rotate.sh 中):

  1. 按修改时间清理(推荐):Nginx 日志滚动后,新文件时间戳会更新,旧文件保持原修改时间,-mtime +30 表示“30 天前修改的文件”
  2. 命令示例find /var/log/nginx/ -name "access.log.*" -mtime +30 -delete
  3. 安全起见,先预览再执行:把 -delete 换成 -ls-print,确认匹配是否正确
  4. 注意通配符匹配范围:确保 access.log.* 不误删 error.log.20240101 这类命名——若格式不统一,建议用 -regex 或更精确的 name 模式

在 logrotate 配置中启用 rotate 和 purge 一体化

如果你用 logrotate 管理 Nginx 日志(推荐方式),无需额外脚本,直接在配置里控制保留数量或天数:

  1. 按保留份数清理:设置 rotate 7 → 最多保留 7 个归档文件,超出自动删除最老的一个
  2. 按保留天数清理(需 logrotate ≥ 3.8.9):添加 maxage 30,表示归档文件超过 30 天即被清理
  3. 完整示例片段
    /var/log/nginx/*.log {dailymissingokrotate 7maxage 30compressdelaycompressnotifemptycreate 0644 www-data www-datasharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript}

避免误删:加一层路径和文件类型保护

生产环境建议增加判断逻辑,防止 findlogrotate 泛匹配导致误操作:

  1. 限定目录深度:加 -maxdepth 1,避免递归进子目录误删
  2. 排除正在使用的日志:不匹配 access.log(当前活跃日志)、access.log.0(刚切分未压缩的)等
  3. 用 stat 验证时间字段:某些场景下 -mtime 可能因系统时区/挂载选项不准,可改用 -newermt "2024-01-01" 按绝对日期判断
  4. 写入清理日志便于审计:例如 find ... -print -delete >> /var/log/nginx/cleanup.log 2>&1

定时任务触发与权限注意事项

无论用哪种方式,最终都要靠 cron 定期执行;务必注意运行身份和权限:

  1. 用 root 或 nginx 所属用户执行:确保有读取日志目录和删除文件的权限
  2. cron 示例(每天凌晨 2 点)0 2 * * * /usr/local/bin/nginx_rotate.sh
  3. 避免并发冲突:如果脚本包含 reload nginx 操作,确保同一时间只有一个实例在运行(可用 flock 加锁)
  4. 测试阶段别用 -delete:先用 -print 看输出,确认无误再上线真实清理逻辑

热门栏目