Files
my-project/config/openclaw/scripts/log-cleaner.sh
T

171 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# ============================================
# 日志清理系统 v1.0
# 功能:自动清理超过15天的日志文件
# 设计原则:保留15天日志,足够分析使用
# ============================================
set -e
# 配置
LOG_DIRS=(
"/root/.openclaw/workspace/sleep-learning"
"/root/.openclaw/logs"
"/root/.openclaw/scripts/token-monitor/logs"
)
# 排除目录(避免扫描大目录导致超时)
EXCLUDE_DIRS=(
"-path" "*/node_modules/*"
"-path" "*/.cache/*"
"-path" "*/.npm/*"
"-path" "*/.pnpm-store/*"
"-path" "*/.git/*"
)
RETENTION_DAYS=15
DATE_FORMAT="+%Y-%m-%d %H:%M:%S"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log_info() {
echo -e "${BLUE}[INFO]${NC} $(date "$DATE_FORMAT") - $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $(date "$DATE_FORMAT") - $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $(date "$DATE_FORMAT") - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date "$DATE_FORMAT") - $1"
}
# 清理单个目录
clean_directory() {
local dir="$1"
if [ ! -d "$dir" ]; then
log_warning "目录不存在: $dir"
return 0
fi
log_info "扫描目录: $dir"
# 构建排除参数
local exclude_args=()
for ((i=0; i<${#EXCLUDE_DIRS[@]}; i+=3)); do
exclude_args+=(${EXCLUDE_DIRS[i]} ${EXCLUDE_DIRS[i+1]} ${EXCLUDE_DIRS[i+2]} -prune -o)
done
# 批量查找超过保留天数的 .log 文件并删除(一次find,批量操作)
local deleted_count=$(find "$dir" -type d \( -path "*/node_modules" -o -path "*/.cache" -o -path "*/.npm" -o -path "*/.pnpm-store" -o -path "*/.git" \) -prune -o -name "*.log" -type f -mtime +$RETENTION_DAYS -print -delete 2>/dev/null | wc -l)
# 统计当前保留的文件
local kept_count=$(find "$dir" -type d \( -path "*/node_modules" -o -path "*/.cache" -o -path "*/.npm" -o -path "*/.pnpm-store" -o -path "*/.git" \) -prune -o -name "*.log" -type f -mtime -$RETENTION_DAYS -print 2>/dev/null | wc -l)
if [ "$deleted_count" -gt 0 ] || [ "$kept_count" -gt 0 ]; then
log_success "目录 $dir: 保留 $kept_count 个, 删除 $deleted_count 个旧日志"
fi
}
# 清理特定模式的文件
clean_pattern_files() {
local patterns=(
"*.log.*" # 轮转日志
"*.log.old" # 旧日志
"*.log.bak" # 备份日志
"*_old.log" # 旧版本日志
)
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
for pattern in "${patterns[@]}"; do
local deleted=$(find "$dir" -name "$pattern" -type f -print -delete 2>/dev/null | wc -l)
[ "$deleted" -gt 0 ] && log_info "模式 $pattern: 删除 $deleted 个文件"
done
fi
done
}
# 清理空目录
clean_empty_dirs() {
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
# 查找并删除空目录(除了顶层目录)
find "$dir" -type d -empty -exec rmdir {} \; 2>/dev/null || true
fi
done
}
# 生成清理报告
generate_report() {
local report_file="/root/.openclaw/workspace/log-cleanup-report-$(date +%Y%m%d).txt"
{
echo "=== 日志清理报告 ==="
echo "执行时间: $(date "$DATE_FORMAT")"
echo "保留天数: $RETENTION_DAYS 天"
echo ""
echo "扫描目录:"
for dir in "${LOG_DIRS[@]}"; do
echo " - $dir"
done
echo ""
# 统计当前日志文件
echo "当前日志文件统计:"
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
local count=$(find "$dir" -name "*.log" -type f 2>/dev/null | wc -l)
echo " - $dir: $count 个文件"
fi
done
echo ""
echo "=== 清理完成 ==="
} > "$report_file"
log_success "清理报告已生成: $report_file"
}
# 主函数
main() {
log_info "开始日志清理 (保留 $RETENTION_DAYS 天)"
log_info "========================================"
# 备份当前状态
local start_time=$(date +%s)
# 执行清理
for dir in "${LOG_DIRS[@]}"; do
clean_directory "$dir"
done
# 清理模式文件
clean_pattern_files
# 清理空目录
clean_empty_dirs
# 生成报告
generate_report
local end_time=$(date +%s)
local duration=$((end_time - start_time))
log_success "日志清理完成,耗时 ${duration} 秒"
log_info "========================================"
}
# 执行
main "$@"