You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

5.7 KiB

Changelog: 日志系统按服务拆分

日期: 2026-02-14
类型: 功能增强
影响范围: 后端日志系统
状态: 已完成


变更概述

将统一的 app.log 拆分为按服务区分的独立日志文件,便于生产环境问题排查和服务监控。

变更详情

修改文件

  1. server/app/core/logging.py
    • 新增 get_log_filename() 函数:根据进程类型自动识别日志文件名
    • 修改 setup_logging() 函数:使用动态日志文件名
    • 更新日志初始化信息:显示当前使用的日志文件

新增文档

  1. docs/server/guides/logging.md
    • 日志文件结构说明
    • 常用命令参考
    • 问题排查场景
    • 最佳实践指南

日志文件变化

变更前

logs/
├── app.log          # 所有服务混合
├── error.log        # 错误日志
└── app_size.log     # 按大小轮转

变更后

logs/
├── app.log              # FastAPI 应用日志
├── celery_ai.log        # AI Worker 日志(新增)
├── celery_export.log    # Export Worker 日志(新增)
├── celery_beat.log      # Beat 调度器日志(新增)
├── error.log            # 错误日志(保持)
└── app_size.log         # 按大小轮转(保持)

日志文件自动识别逻辑

def get_log_filename() -> str:
    """根据进程命令行参数自动识别日志文件名"""
    
    # Celery Beat 调度器
    if 'beat' in sys.argv:
        return 'celery_beat.log'
    
    # Celery AI Worker (队列: ai)
    if '-Q ai' in sys.argv:
        return 'celery_ai.log'
    
    # Celery Export Worker (队列: export)
    if '-Q export' in sys.argv:
        return 'celery_export.log'
    
    # 默认 FastAPI 应用
    return 'app.log'

使用示例

实时监控各服务

# FastAPI 应用
tail -f logs/app.log

# AI 任务处理
tail -f logs/celery_ai.log

# 导出任务处理
tail -f logs/celery_export.log

# 定时任务调度
tail -f logs/celery_beat.log

# 所有错误
tail -f logs/error.log

问题排查

# AI 图片生成失败
grep ERROR logs/celery_ai.log | tail -20

# 导出任务超时
grep "timeout\|TimeoutError" logs/celery_export.log

# API 请求错误
grep "500\|502\|503\|504" logs/app.log

向后兼容性

  • 历史日志(app.log.2026-XX-XX)保持不变
  • 错误日志(error.log)继续收集所有 ERROR 级别日志
  • 日志轮转策略保持一致(每日午夜,保留 30 天)
  • 日志格式完全兼容

测试验证

验证步骤

# 1. 重启容器
docker compose restart

# 2. 等待 5 秒
sleep 5

# 3. 检查日志文件
ls -lh logs/ | grep -E "celery|app.log"

# 4. 验证日志内容
cat logs/celery_ai.log
cat logs/celery_export.log
cat logs/celery_beat.log
cat logs/app.log

验证结果

✅ celery_ai.log - 已创建,包含 AI Worker 初始化日志
✅ celery_export.log - 已创建,包含 Export Worker 初始化日志
✅ celery_beat.log - 已创建,包含 Beat 调度器初始化日志
✅ app.log - 保持原有功能,仅包含 FastAPI 应用日志
✅ error.log - 继续收集所有服务的错误日志

优势

问题排查

  • 🔍 快速定位:直接查看对应服务的日志文件
  • 📊 独立分析:不同服务日志互不干扰
  • 🎯 精准搜索:减少无关日志干扰

运维监控

  • 📈 独立监控:可针对特定服务设置告警规则
  • 🔔 精准告警:AI 任务失败不会被其他日志淹没
  • 📉 性能分析:单独分析 AI/Export 任务耗时

日志管理

  • 💾 存储优化:可针对不同服务设置不同保留策略
  • 🗂️ 分类清晰:便于日志归档和备份
  • 🔄 轮转灵活:AI 日志可设置更短保留期(日志量大)

注意事项

1. 磁盘空间

  • ⚠️ 日志文件数量增加(4 个主日志 + 历史日志)
  • ⚠️ 总体积不变(只是拆分),但需要预留足够空间
  • 💡 建议定期清理 7 天前的历史日志

2. 日志采集

如果使用日志采集工具(如 Filebeat、Fluentd),需要更新配置:

# 旧配置
paths:
  - /app/logs/app.log

# 新配置
paths:
  - /app/logs/app.log
  - /app/logs/celery_ai.log
  - /app/logs/celery_export.log
  - /app/logs/celery_beat.log

3. 日志聚合

使用 ELK/Loki 等日志聚合工具时,建议添加 service 标签:

# Filebeat 配置示例
- type: log
  paths:
    - /app/logs/celery_ai.log
  fields:
    service: celery-ai
    
- type: log
  paths:
    - /app/logs/celery_export.log
  fields:
    service: celery-export

回滚方案

如果需要回滚到统一日志:

# 修改 app/core/logging.py
def get_log_filename() -> str:
    """所有服务使用统一日志文件"""
    return 'app.log'

然后重启容器:

docker compose restart

后续优化建议

短期(1-2 周)

  • 观察日志文件大小增长情况
  • 根据实际使用调整保留策略
  • 添加日志监控告警规则

中期(1-2 月)

  • 接入日志聚合工具(ELK/Loki)
  • 实施自动化日志备份
  • 建立日志分析 Dashboard

长期(3-6 月)

  • 实现日志脱敏自动化
  • 建立日志审计机制
  • 优化日志查询性能

相关文档

负责人

  • 实施: Claude AI Assistant
  • 审核: 待定
  • 部署: 2026-02-14

变更状态: 已完成并验证