日志自动切割与清理脚本
自动切割大日志文件,按日期归档,清理过期日志,支持压缩存储
详细内容
#!/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"}]