在Nginx日志切割脚本中集成自动清理功能,推荐用find按-mtime +30删除过期文件或通过logrotate配置rotate 7与maxage 30实现一体化管理,需限定路径深度、排除活跃日志并用cron定时执行。
在 Nginx 日志切割脚本中加入自动清理过期日志的功能,核心是用 find 命令按修改时间(或创建时间)筛选并删除旧文件,通常配合 logrotate 或自定义 shell 脚本实现。关键不是“只切分”,而是“切分后顺手清”。
这是最轻量、最常用的方式,适合集成在你的日志切割脚本末尾(比如每天执行的 nginx_rotate.sh 中):
-mtime +30 表示“30 天前修改的文件”find /var/log/nginx/ -name "access.log.*" -mtime +30 -delete
-delete 换成 -ls 或 -print,确认匹配是否正确access.log.* 不误删 error.log.20240101 这类命名——若格式不统一,建议用 -regex 或更精确的 name 模式如果你用 logrotate 管理 Nginx 日志(推荐方式),无需额外脚本,直接在配置里控制保留数量或天数:
rotate 7 → 最多保留 7 个归档文件,超出自动删除最老的一个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(刚切分未压缩的)等-mtime 可能因系统时区/挂载选项不准,可改用 -newermt "2024-01-01" 按绝对日期判断find ... -print -delete >> /var/log/nginx/cleanup.log 2>&1
无论用哪种方式,最终都要靠 cron 定期执行;务必注意运行身份和权限:
0 2 * * * /usr/local/bin/nginx_rotate.sh
flock 加锁)-print 看输出,确认无误再上线真实清理逻辑