最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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 中):
-
按修改时间清理(推荐):Nginx 日志滚动后,新文件时间戳会更新,旧文件保持原修改时间,
-mtime +30表示“30 天前修改的文件” -
命令示例:
find /var/log/nginx/ -name "access.log.*" -mtime +30 -delete -
安全起见,先预览再执行:把
-delete换成-ls或-print,确认匹配是否正确 -
注意通配符匹配范围:确保
access.log.*不误删error.log.20240101这类命名——若格式不统一,建议用-regex或更精确的name模式
在 logrotate 配置中启用 rotate 和 purge 一体化
如果你用 logrotate 管理 Nginx 日志(推荐方式),无需额外脚本,直接在配置里控制保留数量或天数:
-
按保留份数清理:设置
rotate 7→ 最多保留 7 个归档文件,超出自动删除最老的一个 -
按保留天数清理(需 logrotate ≥ 3.8.9):添加
maxage 30,表示归档文件超过 30 天即被清理 -
完整示例片段:
/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}
避免误删:加一层路径和文件类型保护
生产环境建议增加判断逻辑,防止 find 或 logrotate 泛匹配导致误操作:
-
限定目录深度:加
-maxdepth 1,避免递归进子目录误删 -
排除正在使用的日志:不匹配
access.log(当前活跃日志)、access.log.0(刚切分未压缩的)等 -
用 stat 验证时间字段:某些场景下
-mtime可能因系统时区/挂载选项不准,可改用-newermt "2024-01-01"按绝对日期判断 -
写入清理日志便于审计:例如
find ... -print -delete >> /var/log/nginx/cleanup.log 2>&1
定时任务触发与权限注意事项
无论用哪种方式,最终都要靠 cron 定期执行;务必注意运行身份和权限:
- 用 root 或 nginx 所属用户执行:确保有读取日志目录和删除文件的权限
-
cron 示例(每天凌晨 2 点):
0 2 * * * /usr/local/bin/nginx_rotate.sh -
避免并发冲突:如果脚本包含 reload nginx 操作,确保同一时间只有一个实例在运行(可用
flock加锁) -
测试阶段别用 -delete:先用
-print看输出,确认无误再上线真实清理逻辑