每日备份 2026-06-10 12:57:13
This commit is contained in:
1 parent
fda2ccb8c2
commit
3d2e638c6a
244 files changed
+58890
-3
No files matched your search
Executable
+171
@@ -0,0 +1,171 @@
|
||||
#!/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 "$@"
|
||||
Reference in new issue
Block a user