#!/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 "$@"