xianyu-auto-reply/USER_LOGGING_IMPROVEMENT.md
2025-07-25 17:24:29 +08:00

7.8 KiB
Raw Blame History

用户日志显示改进总结

🎯 改进目标

在多用户系统中,原有的日志无法识别具体的操作用户,导致调试和监控困难。本次改进为所有系统日志添加了当前登录用户的信息。

📊 改进内容

1. API请求/响应日志增强

改进前

2025-07-25 15:40:28.714 | INFO | reply_server:log_requests:223 - 🌐 API请求: GET /keywords/执念小店70
2025-07-25 15:40:28.725 | INFO | reply_server:log_requests:228 - ✅ API响应: GET /keywords/执念小店70 - 200 (0.011s)

改进后

2025-07-25 15:40:28.714 | INFO | reply_server:log_requests:223 - 🌐 【admin#1】 API请求: GET /keywords/执念小店70
2025-07-25 15:40:28.725 | INFO | reply_server:log_requests:228 - ✅ 【admin#1】 API响应: GET /keywords/执念小店70 - 200 (0.011s)

2. 业务操作日志增强

用户认证相关

  • 登录尝试: 【username】尝试登录
  • 登录成功: 【username#user_id】登录成功
  • 登录失败: 【username】登录失败: 用户名或密码错误
  • 注册操作: 【username】尝试注册邮箱: email

Cookie管理相关

  • 添加Cookie: 【username#user_id】尝试添加Cookie: cookie_id
  • 操作成功: 【username#user_id】Cookie添加成功: cookie_id
  • 权限冲突: 【username#user_id】Cookie ID冲突: cookie_id 已被其他用户使用

卡券管理相关

  • 创建卡券: 【username#user_id】创建卡券: card_name
  • 创建成功: 【username#user_id】卡券创建成功: card_name (ID: card_id)
  • 创建失败: 【username#user_id】创建卡券失败: card_name - error

关键字管理相关

  • 更新关键字: 【username#user_id】更新Cookie关键字: cookie_id, 数量: count
  • 权限验证: 【username#user_id】尝试操作其他用户的Cookie关键字: cookie_id

用户设置相关

  • 设置更新: 【username#user_id】更新用户设置: key = value
  • 更新成功: 【username#user_id】用户设置更新成功: key

🔧 技术实现

1. 中间件增强

@app.middleware("http")
async def log_requests(request, call_next):
    # 获取用户信息
    user_info = "未登录"
    try:
        auth_header = request.headers.get("Authorization")
        if auth_header and auth_header.startswith("Bearer "):
            token = auth_header.split(" ")[1]
            if token in SESSION_TOKENS:
                token_data = SESSION_TOKENS[token]
                if time.time() - token_data['timestamp'] <= TOKEN_EXPIRE_TIME:
                    user_info = f"【{token_data['username']}#{token_data['user_id']}】"
    except Exception:
        pass
    
    logger.info(f"🌐 {user_info} API请求: {request.method} {request.url.path}")
    # ...

2. 统一日志工具函数

def get_user_log_prefix(user_info: Dict[str, Any] = None) -> str:
    """获取用户日志前缀"""
    if user_info:
        return f"【{user_info['username']}#{user_info['user_id']}】"
    return "【系统】"

def log_with_user(level: str, message: str, user_info: Dict[str, Any] = None):
    """带用户信息的日志记录"""
    prefix = get_user_log_prefix(user_info)
    full_message = f"{prefix} {message}"
    
    if level.lower() == 'info':
        logger.info(full_message)
    elif level.lower() == 'error':
        logger.error(full_message)
    # ...

3. 业务接口改进

@app.post("/cookies")
def add_cookie(item: CookieIn, current_user: Dict[str, Any] = Depends(get_current_user)):
    try:
        log_with_user('info', f"尝试添加Cookie: {item.id}", current_user)
        # 业务逻辑...
        log_with_user('info', f"Cookie添加成功: {item.id}", current_user)
    except Exception as e:
        log_with_user('error', f"添加Cookie失败: {item.id} - {str(e)}", current_user)

📋 修改的文件和接口

reply_server.py

  • 中间件: log_requests - API请求/响应日志
  • 工具函数: get_user_log_prefix, log_with_user
  • 认证接口: 登录、注册接口
  • 业务接口: Cookie管理、卡券管理、关键字管理、用户设置

修改的接口数量

  • API中间件: 1个影响所有接口
  • 认证相关: 2个接口登录、注册
  • Cookie管理: 1个接口添加Cookie
  • 卡券管理: 1个接口创建卡券
  • 关键字管理: 1个接口更新关键字
  • 用户设置: 1个接口更新设置

🎯 日志格式规范

用户标识格式

  • 已登录用户: 【username#user_id】
  • 未登录用户: 【未登录】
  • 系统操作: 【系统】

日志级别使用

  • INFO: 正常操作、成功操作
  • WARNING: 权限验证失败、业务规则冲突
  • ERROR: 系统错误、操作失败

消息格式

  • 操作尝试: 尝试{操作}: {对象}
  • 操作成功: {操作}成功: {对象}
  • 操作失败: {操作}失败: {对象} - {原因}

💡 日志分析技巧

1. 按用户过滤

# 查看特定用户的所有操作
grep '【admin#1】' logs/xianyu_2025-07-25.log

# 查看特定用户的API请求
grep '【admin#1】.*API请求' logs/xianyu_2025-07-25.log

2. 监控用户活动

# 统计用户活跃度
grep -o '【[^】]*#[^】]*】' logs/xianyu_2025-07-25.log | sort | uniq -c

# 查看登录活动
grep '登录' logs/xianyu_2025-07-25.log

3. 权限验证监控

# 查看权限验证失败
grep '无权限\|权限验证失败' logs/xianyu_2025-07-25.log

# 查看跨用户访问尝试
grep '尝试操作其他用户' logs/xianyu_2025-07-25.log

4. 错误追踪

# 查看特定用户的错误
grep 'ERROR.*【admin#1】' logs/xianyu_2025-07-25.log

# 查看操作失败
grep '失败.*【.*】' logs/xianyu_2025-07-25.log

🔍 监控指标建议

1. 用户活跃度指标

  • 每个用户的API调用频率
  • 用户登录频率和时长
  • 用户操作成功率

2. 安全监控指标

  • 登录失败次数(按用户)
  • 权限验证失败次数
  • 跨用户访问尝试次数

3. 业务监控指标

  • Cookie操作频率按用户
  • 卡券创建和使用情况
  • 用户设置修改频率

🚀 部署和使用

1. 立即生效

重启服务后,新的日志格式立即生效:

# 重启服务
docker-compose restart

# 查看新的日志格式
docker-compose logs -f | grep '【.*】'

2. 日志轮转配置

确保日志轮转能够处理增加的日志内容:

# loguru配置
logger.add(
    "logs/xianyu_{time:YYYY-MM-DD}.log",
    rotation="100 MB",
    retention="7 days",
    compression="zip",
    format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {name}:{function}:{line} - {message}"
)

3. 监控工具集成

如果使用ELK、Grafana等监控工具可以基于用户标识创建仪表板

  • 按用户分组的操作统计
  • 用户行为分析
  • 安全事件监控

🎉 改进效果

1. 调试效率提升

  • 问题定位: 快速定位特定用户的问题
  • 操作追踪: 完整的用户操作链路追踪
  • 权限验证: 清晰的权限验证日志

2. 监控能力增强

  • 用户行为: 详细的用户行为分析
  • 安全监控: 实时的安全事件监控
  • 性能分析: 按用户维度的性能分析

3. 运维管理优化

  • 故障排查: 快速定位用户相关问题
  • 容量规划: 基于用户活跃度的容量规划
  • 安全审计: 完整的用户操作审计日志

📞 使用建议

  1. 日志查看: 使用 grep 命令按用户过滤日志
  2. 实时监控: 使用 tail -f 实时监控特定用户操作
  3. 定期分析: 定期分析用户活跃度和操作模式
  4. 安全审计: 定期检查权限验证失败和异常操作

总结: 通过本次改进,多用户系统的日志现在具备了完整的用户标识能力,大大提升了系统的可观测性和可维护性!