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"

脚本说明

  1. 日志目录

    • LOG_DIR 定义了 Nginx 日志文件的存储目录,默认是 /var/log/nginx。你可以根据实际路径修改。
  2. 日志切割

    • 脚本会将当前的 access.logerror.log 文件重命名为 access_YYYY-MM-DD.logerror_YYYY-MM-DD.log,其中 YYYY-MM-DD 是前一天的日期。
    • 通过向 Nginx 主进程发送 USR1 信号,通知 Nginx 重新打开日志文件。
  3. 日志压缩

    • 使用 gzip 命令将切割后的日志文件压缩为 .gz 格式,以节省磁盘空间。
  4. 日志清理

    • 使用 find 命令查找并删除 30 天前的旧日志文件(文件名格式为 access_*.log.gzerror_*.log.gz)。
  5. 操作日志

    • 每次运行脚本时,会将操作记录到 nginx_log_cleanup.log 中,方便后续查看。

使用方法

  1. 将脚本保存为文件,例如 /usr/local/bin/rotate_compress_clean_nginx_logs.sh
  2. 赋予脚本执行权限:
    chmod +x /usr/local/bin/rotate_compress_clean_nginx_logs.sh
    
  3. 手动运行脚本测试:
    /usr/local/bin/rotate_compress_clean_nginx_logs.sh
    
  4. 如果需要每天自动运行,可以将脚本添加到 crontab 中。例如,每天凌晨 0 点运行:
    crontab -e
    
    添加以下内容:
    0 0 * * * /usr/local/bin/rotate_compress_clean_nginx_logs.sh
    

注意事项

  1. 权限问题
    确保脚本以具有足够权限的用户(如 root)运行,否则可能无法删除、重命名或压缩日志文件。

  2. 测试
    在生产环境中运行之前,建议先在测试环境中验证脚本的正确性。

  3. 日志轮换
    如果已经配置了 logrotate 来管理 Nginx 日志,请确保脚本与 logrotate 的配置不冲突。

  4. 备份
    如果需要保留某些重要日志,可以在删除前备份到其他位置。

  5. 压缩文件格式
    脚本使用 gzip 压缩日志文件,压缩后的文件格式为 .gz。如果需要其他格式(如 .zip),可以修改脚本中的压缩命令。


通过这个脚本,你可以实现 Nginx 日志按天切割、压缩并自动清理旧日志,有效管理磁盘空间并保留必要的日志记录。

作者:dashery原文地址:https://www.cnblogs.com/ydswin/p/18664322

%s 个评论

要回复文章请先登录注册