59 lines
1.7 KiB
Bash
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
|