以下是一个完整的 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 点运行:添加以下内容:
- 0 0 * * * /usr/local/bin/rotate_compress_clean_nginx_logs.sh
复制代码 注意事项
- 权限问题
确保脚本以具有充足权限的用户(如 root)运行,否则大概无法删除、重命名或压缩日志文件。
- 测试
在生产情况中运行之前,建议先在测试情况中验证脚本的精确性。
- 日志轮换
如果已经设置了 logrotate 来管理 Nginx 日志,请确保脚本与 logrotate 的设置不冲突。
- 备份
如果需要保留某些重要日志,可以在删除前备份到其他位置。
- 压缩文件格式
脚本使用 gzip 压缩日志文件,压缩后的文件格式为 .gz。如果需要其他格式(如 .zip),可以修改脚本中的压缩命令。
通过这个脚本,你可以实现 Nginx 日志按天切割、压缩并自动清理旧日志,有效管理磁盘空间并保留须要的日志记录。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |