ydswin

忘记背后,努力面前的,向着标杆直跑

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

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 日志按天切割、压缩并自动清理旧日志,有效管理磁盘空间并保留必要的日志记录。

posted on   dashery  阅读(157)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
点击右上角即可分享
微信分享提示