Files

59 lines
1.7 KiB
Bash

#!/bin/bash
# 로그 로테이션 (macOS 호환 버전)
# 매일 04:00 실행 (야간 종합 점검 전)
set -euo pipefail
LOG_DIR=~/.openclaw/logs
ARCHIVE_DIR=$LOG_DIR/archive
mkdir -p "$ARCHIVE_DIR"
DATE=$(date +%Y%m%d)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "=== Log Rotation: $DATE ==="
rotate_log() {
local logfile="$1"
local threshold="$2" # KB
local name=$(basename "$logfile" .log)
if [ ! -f "$logfile" ]; then
return
fi
# macOS: stat -f%z, Linux: stat -c%s
local size=$(stat -f%z "$logfile" 2>/dev/null || stat -c%s "$logfile" 2>/dev/null)
local size_kb=$((size / 1024))
if [ "$size_kb" -ge "$threshold" ]; then
# copytruncate 방식 (로그 유실 방지)
cp "$logfile" "$ARCHIVE_DIR/${name}.${TIMESTAMP}.log"
cat /dev/null > "$logfile"
gzip -f "$ARCHIVE_DIR/${name}.${TIMESTAMP}.log"
echo "${name}.log rotated (${size_kb}KB)"
return 0
else
echo "⏭️ ${name}.log OK (${size_kb}KB < ${threshold}KB)"
return 1
fi
}
# 로테이션 실행 (임계치: KB)
rotate_log "$LOG_DIR/gateway.log" 500 || true # 500KB
rotate_log "$LOG_DIR/gateway.err.log" 100 || true # 100KB
rotate_log "$LOG_DIR/watchdog.log" 300 || true # 300KB
rotate_log "$LOG_DIR/response-guard.log" 200 || true # 200KB
rotate_log "$LOG_DIR/context-monitor.log" 200 || true # 200KB
# 30일 이상 된 아카이브 삭제
OLD_COUNT=$(find "$ARCHIVE_DIR" -name "*.gz" -mtime +30 2>/dev/null | wc -l | tr -d ' ')
find "$ARCHIVE_DIR" -name "*.gz" -mtime +30 -delete 2>/dev/null
echo "🗑️ Old archives: $OLD_COUNT deleted"
# 현재 상태
echo ""
echo "=== Current Logs ==="
du -sh "$LOG_DIR" 2>/dev/null
ls -lh "$LOG_DIR"/*.log 2>/dev/null | awk '{printf "%-40s %s\n", $9, $5}' | tail -5