Files
MAGAIL4AutoDrive/Env/LOGGING_GUIDE.md

414 lines
9.1 KiB
Markdown
Raw Normal View History

# 日志记录功能使用指南
## 📋 概述
为所有运行脚本添加了日志记录功能,可以将终端输出同时保存到文本文件,方便后续分析和问题排查。
---
## 🎯 功能特点
1. **双向输出**:同时输出到终端和文件,不影响实时查看
2. **自动管理**:使用上下文管理器,自动处理文件开启/关闭
3. **灵活配置**:支持自定义文件名和日志目录
4. **时间戳命名**:默认使用时间戳生成唯一文件名
5. **无缝集成**:只需添加命令行参数,无需修改代码
---
## 🚀 快速使用
### 1. 基础用法
```bash
# 不启用日志(默认)
python Env/run_multiagent_env.py
# 启用日志记录
python Env/run_multiagent_env.py --log
# 或使用短选项
python Env/run_multiagent_env.py -l
```
### 2. 自定义文件名
```bash
# 使用自定义日志文件名
python Env/run_multiagent_env.py --log --log-file=my_test.log
# 测试脚本也支持
python Env/test_lane_filter.py --log --log-file=test_results.log
```
### 3. 组合使用调试和日志
```bash
# 测试脚本:调试模式 + 日志记录
python Env/test_lane_filter.py --debug --log
# 会生成类似test_debug_20251021_123456.log
```
---
## 📁 日志文件位置
默认日志目录:`Env/logs/`
### 文件命名规则
| 脚本 | 默认文件名格式 | 示例 |
|------|---------------|------|
| `run_multiagent_env.py` | `run_YYYYMMDD_HHMMSS.log` | `run_20251021_143022.log` |
| `run_multiagent_env_fast.py` | `run_fast.log` | `run_fast.log` |
| `test_lane_filter.py` | `test_{mode}_YYYYMMDD_HHMMSS.log` | `test_debug_20251021_143500.log` |
**说明**
- `YYYYMMDD_HHMMSS` 是时间戳年月日_时分秒
- `{mode}` 是测试模式(`standard``debug`
---
## 📝 所有支持的脚本
### 1. run_multiagent_env.py标准运行脚本
```bash
# 不启用日志
python Env/run_multiagent_env.py
# 启用日志(自动生成时间戳文件名)
python Env/run_multiagent_env.py --log
# 自定义文件名
python Env/run_multiagent_env.py --log --log-file=run_test1.log
```
**日志位置**`Env/logs/run_YYYYMMDD_HHMMSS.log`
---
### 2. run_multiagent_env_fast.py高性能版本
```bash
# 启用日志
python Env/run_multiagent_env_fast.py --log
# 自定义文件名
python Env/run_multiagent_env_fast.py --log --log-file=fast_test.log
```
**日志位置**`Env/logs/run_fast.log`(默认)
---
### 3. test_lane_filter.py测试脚本
```bash
# 标准测试 + 日志
python Env/test_lane_filter.py --log
# 调试测试 + 日志
python Env/test_lane_filter.py --debug --log
# 自定义文件名
python Env/test_lane_filter.py --log --log-file=my_test.log
# 组合使用
python Env/test_lane_filter.py --debug --log --log-file=debug_run.log
```
**日志位置**
- 标准模式:`Env/logs/test_standard_YYYYMMDD_HHMMSS.log`
- 调试模式:`Env/logs/test_debug_YYYYMMDD_HHMMSS.log`
---
## 💻 编程接口
如果您想在代码中直接使用日志功能:
```python
from logger_utils import setup_logger
# 方式1使用上下文管理器推荐
with setup_logger(log_file="my_log.log", log_dir="logs"):
print("这条消息会同时输出到终端和文件")
# 运行您的代码
# ...
# 方式2手动管理
from logger_utils import LoggerContext
logger = LoggerContext(log_file="custom.log", log_dir="output")
logger.__enter__() # 开启日志
print("输出消息")
logger.__exit__(None, None, None) # 关闭日志
```
---
## 📊 日志内容示例
### 标准运行
```
📝 日志记录已启用
📁 日志文件: Env/logs/run_20251021_143022.log
------------------------------------------------------------
💡 提示: 使用 --log 或 -l 参数启用日志记录
示例: python run_multiagent_env.py --log
自定义文件名: python run_multiagent_env.py --log --log-file=my_run.log
------------------------------------------------------------
[INFO] Environment: MultiAgentScenarioEnv
[INFO] MetaDrive version: 0.4.3
...
------------------------------------------------------------
✅ 日志已保存到: Env/logs/run_20251021_143022.log
```
### 调试模式
```
📝 日志记录已启用
📁 日志文件: Env/logs/test_debug_20251021_143500.log
------------------------------------------------------------
🐛 调试模式启用
============================================================
📍 场景信息统计:
- 总车道数: 123
- 有红绿灯的车道数: 0
⚠️ 场景中没有红绿灯!
🔍 开始车道过滤: 共 51 辆车待检测
...
------------------------------------------------------------
✅ 日志已保存到: Env/logs/test_debug_20251021_143500.log
```
---
## 🔧 高级配置
### 自定义日志目录
```python
from logger_utils import setup_logger
# 指定不同的日志目录
with setup_logger(log_file="test.log", log_dir="my_logs"):
print("日志会保存到 my_logs/test.log")
```
### 追加模式
```python
from logger_utils import setup_logger
# 追加到现有文件(而不是覆盖)
with setup_logger(log_file="test.log", mode='a'): # mode='a' 表示追加
print("这条消息会追加到文件末尾")
```
### 只重定向特定输出
```python
from logger_utils import LoggerContext
# 只重定向stdout不重定向stderr
logger = LoggerContext(
log_file="test.log",
redirect_stdout=True, # 重定向标准输出
redirect_stderr=False # 不重定向错误输出
)
```
---
## 📋 命令行参数总结
| 参数 | 短选项 | 说明 | 示例 |
|------|--------|------|------|
| `--log` | `-l` | 启用日志记录 | `--log` |
| `--log-file=NAME` | 无 | 指定日志文件名 | `--log-file=test.log` |
| `--debug` | `-d` | 启用调试模式test_lane_filter.py | `--debug` |
### 参数组合
```bash
# 示例1标准模式 + 日志
python Env/test_lane_filter.py --log
# 示例2调试模式 + 日志
python Env/test_lane_filter.py --debug --log
# 示例3调试 + 自定义文件名
python Env/test_lane_filter.py -d --log --log-file=my_debug.log
# 示例4所有参数
python Env/test_lane_filter.py --debug --log --log-file=full_test.log
```
---
## 🛠️ 常见问题
### Q1: 日志文件在哪里?
**A**: 默认在 `Env/logs/` 目录下。如果目录不存在,会自动创建。
```bash
# 查看所有日志文件
ls -lh Env/logs/
# 查看最新的日志
ls -lt Env/logs/ | head -5
```
---
### Q2: 如何查看日志内容?
**A**: 使用任何文本编辑器或命令行工具:
```bash
# 方式1使用cat
cat Env/logs/run_20251021_143022.log
# 方式2使用less可翻页
less Env/logs/run_20251021_143022.log
# 方式3查看末尾内容
tail -n 50 Env/logs/run_20251021_143022.log
# 方式4实时监控适合长时间运行
tail -f Env/logs/run_20251021_143022.log
```
---
### Q3: 日志文件太多怎么办?
**A**: 可以定期清理旧日志:
```bash
# 删除7天前的日志
find Env/logs/ -name "*.log" -mtime +7 -delete
# 只保留最新的10个日志
cd Env/logs && ls -t *.log | tail -n +11 | xargs rm -f
```
---
### Q4: 日志会影响性能吗?
**A**: 影响很小,因为:
1. 文件I/O是异步的
2. 使用了缓冲区
3. 立即刷新确保数据不丢失
如果追求极致性能,建议训练时不启用日志,只在需要分析时启用。
---
### Q5: 可以同时记录多个脚本的日志吗?
**A**: 可以,每个脚本使用不同的日志文件:
```bash
# 终端1
python Env/run_multiagent_env.py --log --log-file=script1.log
# 终端2同时运行
python Env/test_lane_filter.py --log --log-file=script2.log
```
---
## 💡 最佳实践
### 1. 开发阶段
```bash
# 使用调试模式 + 日志,方便排查问题
python Env/test_lane_filter.py --debug --log
```
### 2. 长时间运行
```bash
# 启用日志,避免输出丢失
nohup python Env/run_multiagent_env.py --log > /dev/null 2>&1 &
# 查看实时输出
tail -f Env/logs/run_*.log
```
### 3. 批量实验
```bash
# 为每次实验使用不同的日志文件
for i in {1..5}; do
python Env/run_multiagent_env.py --log --log-file=exp_${i}.log
done
```
### 4. 性能测试
```bash
# 不启用日志,获得最佳性能
python Env/run_multiagent_env_fast.py
```
---
## 📖 相关文档
- `README.md` - 项目总览
- `DEBUG_GUIDE.md` - 调试功能使用指南
- `CHANGELOG.md` - 更新日志
---
## 🔍 技术细节
### 实现原理
1. **TeeLogger类**:实现同时写入终端和文件
2. **上下文管理器**:自动管理资源(文件打开/关闭)
3. **sys.stdout重定向**拦截所有print输出
4. **即时刷新**:每次写入后立即刷新,确保数据不丢失
### 源代码
详见 `Env/logger_utils.py`
```python
# 简化示例
class TeeLogger:
def write(self, message):
self.terminal.write(message) # 输出到终端
self.log_file.write(message) # 写入文件
self.log_file.flush() # 立即刷新
```
---
## ✅ 总结
- ✅ 简单易用:只需添加 `--log` 参数
- ✅ 不影响输出:终端仍可实时查看
- ✅ 自动管理:文件自动开启/关闭
- ✅ 灵活配置:支持自定义文件名和目录
- ✅ 完整记录:包含所有调试信息
立即开始使用:
```bash
python Env/test_lane_filter.py --debug --log
```