核心是归档压缩、按需保留、安全删除;先确认日志路径与命名规则,用gzip压缩昨日日志并清空原文件,再通过cron每日归档、weekly清理超期.gz包,全程避免误删且留痕可追溯。

用 Shell 脚本定期汇总并清理 Nginx 旧日志,核心是三步:归档压缩当天前的日志、按需保留历史周期、安全删除过期文件。关键不在“写脚本”,而在“不误删”和“可追溯”。
确认 Nginx 日志路径与命名规则
先查清真实日志位置和轮转习惯,避免脚本跑错目录。常用路径是 /var/log/nginx/,日志名多为 access.log 和 error.log,也可能带日期后缀(如 access.log-20240501)或被 logrotate 处理过。
- 运行 ps aux | grep nginx 看主进程配置路径
- 执行 nginx -t -v 查看编译时默认日志路径
- 检查 /etc/logrotate.d/nginx,确认是否已有外部轮转机制,避免重复操作
编写归档脚本:压缩 + 打时间戳
不直接删,先压缩再挪走,留出人工核查窗口。以下脚本放在 /usr/local/bin/nginx-log-archive.sh:
# !/bin/bash
LOG_DIR="/var/log/nginx"
ARCHIVE_DIR="/var/log/nginx/archive"
DATE=$(date -d "yesterday" +%Y%m%d)
# 创建归档目录
mkdir -p "$ARCHIVE_DIR"
# 压缩昨日的 access.log 和 error.log(若存在)
if [ -f "$LOG_DIR/access.log" ]; then
gzip -c "$LOG_DIR/access.log" > "$ARCHIVE_DIR/access.log-$DATE.gz"
> "$LOG_DIR/access.log"
fi
if [ -f "$LOG_DIR/error.log" ]; then
gzip -c "$LOG_DIR/error.log" > "$ARCHIVE_DIR/error.log-$DATE.gz"
> "$LOG_DIR/error.log"
fi
# 可选:同步清空后向 systemd-journald 记一条痕
logger "Nginx logs archived for $DATE"
注意:> "$LOG_DIR/access.log" 是清空而非删除,确保 Nginx 进程仍能持续写入;gzip 后缀自带时间标识,方便后续筛选。
设置定时任务:用 cron 控制执行节奏
让脚本每天凌晨 2:15 自动运行(避开业务高峰,也错开系统级 logrotate):
- 运行 crontab -e
- 添加一行:15 2 * * * /usr/local/bin/nginx-log-archive.sh >/dev/null 2>&1
- 保存退出,cron 会自动加载
验证是否生效:等次日查看 ls -l /var/log/nginx/archive/ 是否生成带日期的 .gz 文件。
补充清理策略:只删超期的归档包
归档目录长期积累也会占空间,加一个独立清理脚本(如 /usr/local/bin/nginx-log-cleanup.sh),只删 90 天前的 .gz 文件:
find /var/log/nginx/archive -name "*.log-*.gz" -mtime +90 -delete
同样用 cron 调度,例如每周日凌晨执行:0 0 * * 0 /usr/local/bin/nginx-log-cleanup.sh
建议首次运行前先用 -print 替代 -delete 预览将删哪些文件,确认无误再启用删除。


















