Nginx日志按天切割、压缩,并自动清理 30 天前的旧日志文件
以下是一个完整的 Shell 脚本,用于实现 Nginx 日志按天切割、压缩,并自动清理 30 天前的旧日志文件。
脚本内容
#!/bin/bash
# 定义日志目录
LOG_DIR="/var/log/nginx" # Nginx 日志目录
DAYS_TO_KEEP=30 # 保留最近多少天的日志
# 检查日志目录是否存在
if [ ! -d "$LOG_DIR" ]; then
echo "错误:日志目录 $LOG_DIR 不存在!"
exit 1
fi
# 获取昨天的日期(用于日志切割)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
# 切割日志文件
if [ -f "$LOG_DIR/access.log" ]; then
mv "$LOG_DIR/access.log" "$LOG_DIR/access_$YESTERDAY.log"
fi
if [ -f "$LOG_DIR/error.log" ]; then
mv "$LOG_DIR/error.log" "$LOG_DIR/error_$YESTERDAY.log"
fi
# 向 Nginx 主进程发送 USR1 信号,重新打开日志文件
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
# 压缩昨天的日志文件
if [ -f "$LOG_DIR/access_$YESTERDAY.log" ]; then
gzip "$LOG_DIR/access_$YESTERDAY.log"
fi
if [ -f "$LOG_DIR/error_$YESTERDAY.log" ]; then
gzip "$LOG_DIR/error_$YESTERDAY.log"
fi
# 清理 30 天前的旧日志文件
find "$LOG_DIR" -type f -name "access_*.log.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
find "$LOG_DIR" -type f -name "error_*.log.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
# 记录操作日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - 日志已切割、压缩并清理完成。" >> "$LOG_DIR/nginx_log_cleanup.log"
脚本说明
-
日志目录
LOG_DIR
定义了 Nginx 日志文件的存储目录,默认是/var/log/nginx
。你可以根据实际路径修改。
-
日志切割
- 脚本会将当前的
access.log
和error.log
文件重命名为access_YYYY-MM-DD.log
和error_YYYY-MM-DD.log
,其中YYYY-MM-DD
是前一天的日期。 - 通过向 Nginx 主进程发送
USR1
信号,通知 Nginx 重新打开日志文件。
- 脚本会将当前的
-
日志压缩
- 使用
gzip
命令将切割后的日志文件压缩为.gz
格式,以节省磁盘空间。
- 使用
-
日志清理
- 使用
find
命令查找并删除 30 天前的旧日志文件(文件名格式为access_*.log.gz
和error_*.log.gz
)。
- 使用
-
操作日志
- 每次运行脚本时,会将操作记录到
nginx_log_cleanup.log
中,方便后续查看。
- 每次运行脚本时,会将操作记录到
使用方法
- 将脚本保存为文件,例如
/usr/local/bin/rotate_compress_clean_nginx_logs.sh
。 - 赋予脚本执行权限:
chmod +x /usr/local/bin/rotate_compress_clean_nginx_logs.sh
- 手动运行脚本测试:
/usr/local/bin/rotate_compress_clean_nginx_logs.sh
- 如果需要每天自动运行,可以将脚本添加到 crontab 中。例如,每天凌晨 0 点运行:
添加以下内容:crontab -e
0 0 * * * /usr/local/bin/rotate_compress_clean_nginx_logs.sh
注意事项
-
权限问题
确保脚本以具有足够权限的用户(如root
)运行,否则可能无法删除、重命名或压缩日志文件。 -
测试
在生产环境中运行之前,建议先在测试环境中验证脚本的正确性。 -
日志轮换
如果已经配置了logrotate
来管理 Nginx 日志,请确保脚本与logrotate
的配置不冲突。 -
备份
如果需要保留某些重要日志,可以在删除前备份到其他位置。 -
压缩文件格式
脚本使用gzip
压缩日志文件,压缩后的文件格式为.gz
。如果需要其他格式(如.zip
),可以修改脚本中的压缩命令。
通过这个脚本,你可以实现 Nginx 日志按天切割、压缩并自动清理旧日志,有效管理磁盘空间并保留必要的日志记录。
本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/18664322