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.
 

8.6 KiB

轻量级日志系统实施

日期: 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

变更

# 初始化配置和日志
settings = get_settings()
setup_logging()
logger = get_logger()

说明

  • 在应用启动时初始化日志系统
  • 使用统一的 logger 实例

3. 优化配置文件

文件: server/app/core/config.py

新增配置

# 日志配置
LOG_LEVEL: str = "INFO"  # DEBUG, INFO, WARNING, ERROR, CRITICAL

推荐配置

  • 开发环境:INFODEBUG
  • 测试环境:INFO
  • 生产环境:WARNINGERROR

4. 修改 Docker Compose

文件: server/docker-compose.yml

变更:为所有容器添加日志目录挂载

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 行日志
  • 实时跟踪日志
  • 查看错误日志
  • 搜索日志内容
  • 查看指定日期的日志
  • 查看容器日志

使用示例

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. 启动服务

    cd server
    docker-compose up -d
    
  2. 查看日志

    # 方法 1:使用日志查看脚本(推荐)
    ./scripts/view_logs.sh -f
    
    # 方法 2:直接查看日志文件
    tail -f logs/app_$(date +%Y-%m-%d).log
    
    # 方法 3:查看容器日志
    docker logs -f jointo-server-app
    
  3. 查看错误日志

    ./scripts/view_logs.sh -e
    

生产环境

  1. 配置环境变量

    # .env
    ENVIRONMENT=production
    LOG_LEVEL=WARNING
    DATABASE_ECHO=False
    
  2. 重启服务

    docker-compose restart app
    
  3. 监控日志

    # 定期检查错误日志
    ./scripts/view_logs.sh -e
    
    # 或者配置 cron 定时任务
    0 * * * * cd /path/to/server && ./scripts/view_logs.sh -e | mail -s "错误日志" admin@example.com
    

验证步骤

1. 验证日志文件生成

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. 验证日志内容

# 查看应用日志
./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. 验证错误日志

# 触发一个错误(访问不存在的端点)
curl http://localhost:6170/api/v1/nonexistent

# 查看错误日志
./scripts/view_logs.sh -e

# 应该看到 404 错误日志

4. 验证日志轮转

# 模拟日志轮转(修改系统时间或等待午夜)
# 或者手动创建大文件测试大小轮转

# 检查是否生成新的日志文件
ls -lh logs/

性能影响

资源占用

  • 磁盘空间: 约 10-50 MB/天(取决于日志级别和流量)
  • CPU: 异步写入,几乎无影响(< 1%)
  • 内存: 约 5-10 MB(日志缓冲区)

优化建议

  1. 生产环境使用 WARNING 或 ERROR 级别

    LOG_LEVEL=WARNING
    
  2. 关闭 SQLAlchemy 日志

    DATABASE_ECHO=False
    
  3. 定期清理旧日志

    # 删除 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(全栈监控)

相关文档

测试结果

日志文件正常生成
日志内容格式正确
日志轮转正常工作
错误日志正确记录
日志查看脚本正常工作
容器重启后日志保留

总结

成功实施轻量级日志系统,解决了日志持久化、分级管理、轮转等问题。系统运行稳定,满足当前开发和测试需求。未来可以根据项目规模和需求,升级到企业级日志系统。