171 lines
4.6 KiB
Bash
Executable File
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 "$@" |