Files
MAGAIL4AutoDrive/Env/LOGGING_GUIDE.md

414 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 日志记录功能使用指南
## 📋 概述
为所有运行脚本添加了日志记录功能,可以将终端输出同时保存到文本文件,方便后续分析和问题排查。
---
## 🎯 功能特点
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
```