日志自动切割与清理脚本

代码脚本 · 其他

自动切割大日志文件,按日期归档,清理过期日志,支持压缩存储

详细内容

#!/bin/bash # ========================================== # 日志自动切割与清理脚本 # 用途:自动切割大日志文件,按日期归档,清理过期日志 # 使用方法: # 1. 修改 LOG_PATHS 配置 # 2. bash log_rotate.sh # 3. 建议加入crontab每天凌晨执行 # ========================================== # ========== 配置 ========== # 要切割的日志文件(支持通配符) LOG_PATHS=( "/var/log/nginx/*.log" "/var/log/app/*.log" # 在此添加更多日志路径 ) # 保留天数 RETENTION_DAYS=30 # 切割后是否压缩 COMPRESS=true # 切割大小阈值(超过此大小才切割,单位MB) MAX_SIZE_MB=100 # 归档目录 ARCHIVE_DIR="/var/log/archive" # ========================== mkdir -p "$ARCHIVE_DIR" DATE=$(date '+%Y%m%d') echo "========== 日志切割开始 ==========" echo "执行时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "归档目录: $ARCHIVE_DIR" echo "保留天数: $RETENTION_DAYS" echo "" TOTAL_ROTATED=0 TOTAL_SIZE=0 # 遍历所有日志文件 for pattern in "${LOG_PATHS[@]}"; do for logfile in $pattern; do # 检查文件是否存在 [ -f "$logfile" ] || continue filename=$(basename "$logfile") dirname=$(dirname "$logfile") filesize_mb=$(du -m "$logfile" | cut -f1) echo "处理: $logfile (${filesize_mb}MB)" # 检查是否超过大小阈值 if [ "$filesize_mb" -lt "$MAX_SIZE_MB" ]; then echo " - 小于${MAX_SIZE_MB}MB,跳过切割" continue fi # 创建归档子目录 archive_subdir="$ARCHIVE_DIR/$(echo "$dirname" | sed 's|/|_|g')" mkdir -p "$archive_subdir" # 切割日志 archive_file="$archive_subdir/${filename%.log}_${DATE}.log" cp "$logfile" "$archive_file" # 清空原日志(不删除,避免进程文件句柄问题) > "$logfile" # 压缩 if [ "$COMPRESS" = true ]; then gzip -f "$archive_file" archive_file="${archive_file}.gz" fi archive_size=$(du -h "$archive_file" | cut -f1) echo " ✓ 已切割归档: $archive_file ($archive_size)" TOTAL_ROTATED=$((TOTAL_ROTATED + 1)) TOTAL_SIZE=$((TOTAL_SIZE + filesize_mb)) done done echo "" echo "清理${RETENTION_DAYS}天前的归档文件..." find "$ARCHIVE_DIR" -type f -mtime +$RETENTION_DAYS -delete find "$ARCHIVE_DIR" -type d -empty -delete echo " ✓ 已清理过期归档" # 额外清理系统旧日志 echo "" echo "清理系统临时日志..." find /var/log -type f -name "*.gz" -mtime +$RETENTION_DAYS -delete 2>/dev/null find /var/log -type f -name "*.old" -mtime +$RETENTION_DAYS -delete 2>/dev/null find /var/log -type f -name "*.[0-9]" -mtime +$RETENTION_DAYS -delete 2>/dev/null echo " ✓ 已清理系统旧日志" echo "" echo "========== 日志切割完成 ==========" echo "切割文件数: $TOTAL_ROTATED" echo "释放空间约: ${TOTAL_SIZE}MB" echo "完成时间: $(date '+%Y-%m-%d %H:%M:%S')"

适配环境

适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+

依赖环境:bash 4.0+

参数说明

[{"name": "LOG_PATHS", "label": "\u65e5\u5fd7\u8def\u5f84(\u6bcf\u884c\u4e00\u4e2a\uff0c\u652f\u6301\u901a\u914d\u7b26)", "type": "textarea", "default": "/var/log/nginx/*.log"}, {"name": "RETENTION_DAYS", "label": "\u4fdd\u7559\u5929\u6570", "default": "30"}, {"name": "MAX_SIZE_MB", "label": "\u5207\u5272\u9608\u503c(MB)", "default": "100"}]
日志切割清理

更多其他