# 存储服务模块

本模块提供了文件存储、Session管理和日志管理的相关服务。

## 模块组成

### 1. SessionCleaner - Session自动清理器

自动清理过期的Flask session文件。

#### 功能特性

- **自动清理**: 后台线程定期清理过期session文件
- **智能判断**: 根据session生命周期和文件修改时间判断是否过期
- **安全缓冲**: 使用session_lifetime + 1小时作为缓冲，确保完全过期

#### 使用方式

```python
from app.services.storage import SessionCleaner

# 创建清理器
session_cleaner = SessionCleaner(
    session_dir="/path/to/flask_session",
    session_lifetime=3600,  # 1小时
    cleanup_interval=3600   # 每小时清理一次
)

# 启动自动清理
session_cleaner.start()

# 立即执行一次清理
deleted_count = session_cleaner.cleanup_now()

# 停止清理器
session_cleaner.stop()
```

#### 配置说明

- `session_dir`: Session文件存储目录
- `session_lifetime`: Session生命周期（秒），默认3600秒（1小时）
- `cleanup_interval`: 清理间隔（秒），默认3600秒（1小时）

### 2. LogManager - 日志管理器

管理日志文件的分类、移动和清理。

#### 功能特性

- **成功日志归档**: 生成成功时，将日志移动到题目目录下的 `logs/` 子目录
- **失败日志归档**: 生成失败时，将日志移动到 `logs/failed/` 目录
- **相关文件处理**: 自动移动相关的日志文件（如 `_readable.txt` 等）
- **旧日志清理**: 支持清理超过指定天数的失败日志

#### 使用方式

```python
from app.services.storage import LogManager

log_manager = LogManager()

# 移动日志到题目目录（成功时）
new_log_path = log_manager.move_log_to_challenge(
    log_file="/path/to/log.txt",
    challenge_output_dir="/path/to/challenge/output"
)

# 移动日志到失败目录（失败时）
new_log_path = log_manager.move_log_to_failed(
    log_file="/path/to/log.txt",
    task_id="task_123"  # 可选
)

# 清理旧的失败日志（超过30天）
deleted_count = log_manager.cleanup_old_failed_logs(days=30)

# 获取题目目录下的所有日志文件
log_files = log_manager.get_log_files_in_challenge("/path/to/challenge/output")
```

#### 目录结构

```
logs/
├── ai_service_*.txt          # AI服务日志（生成中）
├── augment_*.txt             # Augment日志（生成中）
├── claude_router_*.txt       # Claude Router日志（生成中）
├── failed/                   # 失败日志目录
│   ├── ai_service_*_task_*_*.txt
│   └── augment_*_task_*_*.txt
└── production.log            # 生产环境日志

ge10/{category}/output/{challenge}/
├── logs/                     # 成功生成的题目日志
│   ├── ai_service_*.txt
│   └── augment_*.txt
└── ...
```

## 自动集成

### Session清理

Session清理器在应用启动时自动初始化并启动，无需手动配置。

### 日志管理

日志管理器在题目生成过程中自动使用：

- **生成成功**: 日志自动移动到题目目录下的 `logs/` 子目录
- **生成失败**: 日志自动移动到 `logs/failed/` 目录

## 手动清理脚本

使用 `scripts/cleanup_logs.py` 脚本可以手动清理旧的失败日志：

```bash
# 清理超过30天的失败日志
python scripts/cleanup_logs.py --days 30

# 模拟运行（仅显示将要删除的文件）
python scripts/cleanup_logs.py --days 30 --dry-run
```

## 注意事项

1. **Session清理**: Session清理器使用后台线程，应用关闭时会自动停止
2. **日志移动**: 日志文件移动是原子操作，如果移动失败，原文件不会被删除
3. **相关文件**: 系统会自动识别并移动相关的日志文件（如 `_readable.txt`）
4. **路径更新**: 日志文件移动后，数据库中的路径会自动更新

