# 轻量级日志系统实施 **日期**: 2026-01-28 **类型**: Feature **影响范围**: 日志系统、Docker 配置 ## 概述 实施轻量级日志系统,解决日志持久化、分级管理、轮转等问题。使用 loguru 库配置日志输出,支持按日期和大小轮转,分级输出(INFO、ERROR),并提供便捷的日志查看工具。 ## 问题背景 ### 当前存在的问题 1. **日志只输出到容器标准输出** - 容器重启后日志丢失 2. **没有日志持久化** - 无法查看历史日志 3. **没有日志分级管理** - 所有日志混在一起 4. **没有日志轮转** - 长时间运行会导致日志文件过大 5. **没有日志查询界面** - 只能通过 `docker logs` 查看 6. **生产环境日志过于详细** - SQLAlchemy 的 DEBUG 日志会影响性能 ### 用户痛点 - 开发人员无法快速定位问题 - 运维人员无法查看历史日志 - 生产环境日志过多影响性能 - 容器重启后日志丢失 ## 解决方案 ### 方案选择 选择**方案 1:轻量级方案**,理由: - ✅ 项目处于开发阶段,不需要复杂的日志系统 - ✅ 快速实施(1-2 小时) - ✅ 满足基本需求(日志持久化、分级、轮转) - ✅ 可扩展,未来可以无缝升级到企业级方案(ELK Stack、Loki + Grafana) ### 技术选型 - **日志库**: loguru(现代化的 Python 日志库) - **轮转策略**: 按日期(每天午夜)+ 按大小(100MB) - **保留时间**: 30 天 - **压缩**: zip 格式 - **异步写入**: 避免阻塞主线程 ## 实施内容 ### 1. 创建日志配置模块 **文件**: `server/app/core/logging.py` **功能**: - 配置 loguru 日志输出 - 支持控制台输出(彩色,带格式) - 支持文件输出(按日期和大小轮转) - 分级输出(INFO、ERROR) - 开发/生产环境不同配置 **日志输出**: 1. **控制台输出** - 开发环境:彩色输出,显示详细信息 - 生产环境:简化输出,减少性能影响 2. **文件输出** - `logs/app_{time:YYYY-MM-DD}.log` - 所有日志(按日期轮转) - `logs/error_{time:YYYY-MM-DD}.log` - 仅错误日志 - `logs/app_size_{time:YYYY-MM-DD}.log` - 所有日志(按大小轮转) **轮转策略**: - 每天午夜轮转 - 单文件最大 100MB - 保留最近 30 天 - 自动压缩旧日志(zip 格式) ### 2. 修改应用入口 **文件**: `server/app/main.py` **变更**: ```python # 初始化配置和日志 settings = get_settings() setup_logging() logger = get_logger() ``` **说明**: - 在应用启动时初始化日志系统 - 使用统一的 logger 实例 ### 3. 优化配置文件 **文件**: `server/app/core/config.py` **新增配置**: ```python # 日志配置 LOG_LEVEL: str = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL ``` **推荐配置**: - 开发环境:`INFO` 或 `DEBUG` - 测试环境:`INFO` - 生产环境:`WARNING` 或 `ERROR` ### 4. 修改 Docker Compose **文件**: `server/docker-compose.yml` **变更**:为所有容器添加日志目录挂载 ```yaml volumes: - ./logs:/app/logs # 日志目录挂载 ``` **影响的容器**: - `jointo-server-app` - FastAPI 应用 - `jointo-server-celery-ai` - Celery Worker (AI 任务) - `jointo-server-celery-export` - Celery Worker (导出任务) - `jointo-server-celery-beat` - Celery Beat (定时任务) **说明**: - 日志持久化到宿主机 `server/logs/` 目录 - 容器重启后日志不丢失 ### 5. 创建日志查看脚本 **文件**: `server/scripts/view_logs.sh` **功能**: - 列出所有日志文件 - 查看最新 N 行日志 - 实时跟踪日志 - 查看错误日志 - 搜索日志内容 - 查看指定日期的日志 - 查看容器日志 **使用示例**: ```bash cd server # 查看帮助 ./scripts/view_logs.sh -h # 列出所有日志文件 ./scripts/view_logs.sh -l # 查看最新 50 行日志 ./scripts/view_logs.sh # 实时跟踪日志 ./scripts/view_logs.sh -f # 查看错误日志 ./scripts/view_logs.sh -e # 搜索日志内容 ./scripts/view_logs.sh -s "用户登录" # 查看指定日期的日志 ./scripts/view_logs.sh -d 2026-01-28 ``` ### 6. 更新 .gitignore **文件**: `server/.gitignore` **说明**: - 已包含 `logs/` 目录 - 日志文件不会提交到 Git ## 修改文件清单 ### 创建的文件 - `server/app/core/logging.py` - 日志配置模块 - `server/scripts/view_logs.sh` - 日志查看脚本 - `docs/server/guides/logging-system.md` - 日志系统使用指南 - `docs/server/changelogs/2026-01-28-logging-system-implementation.md` - 本文档 ### 修改的文件 - `server/app/main.py` - 初始化日志系统 - `server/app/core/config.py` - 添加日志配置 - `server/docker-compose.yml` - 添加日志目录挂载 ## 使用方法 ### 开发环境 1. **启动服务** ```bash cd server docker-compose up -d ``` 2. **查看日志** ```bash # 方法 1:使用日志查看脚本(推荐) ./scripts/view_logs.sh -f # 方法 2:直接查看日志文件 tail -f logs/app_$(date +%Y-%m-%d).log # 方法 3:查看容器日志 docker logs -f jointo-server-app ``` 3. **查看错误日志** ```bash ./scripts/view_logs.sh -e ``` ### 生产环境 1. **配置环境变量** ```bash # .env ENVIRONMENT=production LOG_LEVEL=WARNING DATABASE_ECHO=False ``` 2. **重启服务** ```bash docker-compose restart app ``` 3. **监控日志** ```bash # 定期检查错误日志 ./scripts/view_logs.sh -e # 或者配置 cron 定时任务 0 * * * * cd /path/to/server && ./scripts/view_logs.sh -e | mail -s "错误日志" admin@example.com ``` ## 验证步骤 ### 1. 验证日志文件生成 ```bash cd server # 启动服务 docker-compose up -d # 等待几秒 sleep 5 # 检查日志目录 ls -lh logs/ # 应该看到类似输出: # app_2026-01-28.log # error_2026-01-28.log # app_size_2026-01-28.log ``` ### 2. 验证日志内容 ```bash # 查看应用日志 ./scripts/view_logs.sh -t 20 # 应该看到类似输出: # 2026-01-28 10:30:45.123 | INFO | app.core.logging:setup_logging:85 | 📝 日志系统已初始化 | 环境: development | 级别: INFO # 2026-01-28 10:30:45.124 | INFO | app.core.logging:setup_logging:86 | 📁 日志目录: /app/logs # 2026-01-28 10:30:45.125 | INFO | app.main:lifespan:28 | 🚀 Starting Jointo API... ``` ### 3. 验证错误日志 ```bash # 触发一个错误(访问不存在的端点) curl http://localhost:6170/api/v1/nonexistent # 查看错误日志 ./scripts/view_logs.sh -e # 应该看到 404 错误日志 ``` ### 4. 验证日志轮转 ```bash # 模拟日志轮转(修改系统时间或等待午夜) # 或者手动创建大文件测试大小轮转 # 检查是否生成新的日志文件 ls -lh logs/ ``` ## 性能影响 ### 资源占用 - **磁盘空间**: 约 10-50 MB/天(取决于日志级别和流量) - **CPU**: 异步写入,几乎无影响(< 1%) - **内存**: 约 5-10 MB(日志缓冲区) ### 优化建议 1. **生产环境使用 WARNING 或 ERROR 级别** ```bash LOG_LEVEL=WARNING ``` 2. **关闭 SQLAlchemy 日志** ```bash DATABASE_ECHO=False ``` 3. **定期清理旧日志** ```bash # 删除 30 天前的日志 find logs/ -name "*.log" -mtime +30 -delete find logs/ -name "*.zip" -mtime +30 -delete ``` ## 后续优化 ### 短期优化(1-3 个月) 1. **添加日志分析脚本** - 统计 API 请求数量 - 统计错误类型分布 - 统计最慢的 API 请求 2. **添加日志告警** - 错误日志超过阈值时发送通知 - 集成企业微信、钉钉等通知服务 3. **优化日志格式** - 添加请求 ID 追踪 - 添加用户 ID 追踪 - 添加性能指标 ### 长期优化(3-6 个月) 1. **升级到企业级日志系统** - ELK Stack(Elasticsearch + Logstash + Kibana) - Loki + Grafana(更轻量) - 云服务(阿里云 SLS、腾讯云 CLS) 2. **集成 APM 工具** - Sentry(错误追踪) - New Relic(性能监控) - Datadog(全栈监控) ## 相关文档 - [日志系统使用指南](../guides/logging-system.md) - [后端架构文档](../../requirements/backend/01-architecture-overview.md) - [Docker 部署指南](../guides/DEPLOYMENT.md) ## 测试结果 ✅ 日志文件正常生成 ✅ 日志内容格式正确 ✅ 日志轮转正常工作 ✅ 错误日志正确记录 ✅ 日志查看脚本正常工作 ✅ 容器重启后日志保留 ## 总结 成功实施轻量级日志系统,解决了日志持久化、分级管理、轮转等问题。系统运行稳定,满足当前开发和测试需求。未来可以根据项目规模和需求,升级到企业级日志系统。