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

250 lines
7.8 KiB
Markdown
Raw 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. 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. 中间件增强
```python
@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. 统一日志工具函数
```python
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. 业务接口改进
```python
@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. 按用户过滤
```bash
# 查看特定用户的所有操作
grep '【admin#1】' logs/xianyu_2025-07-25.log
# 查看特定用户的API请求
grep '【admin#1】.*API请求' logs/xianyu_2025-07-25.log
```
### 2. 监控用户活动
```bash
# 统计用户活跃度
grep -o '【[^】]*#[^】]*】' logs/xianyu_2025-07-25.log | sort | uniq -c
# 查看登录活动
grep '登录' logs/xianyu_2025-07-25.log
```
### 3. 权限验证监控
```bash
# 查看权限验证失败
grep '无权限\|权限验证失败' logs/xianyu_2025-07-25.log
# 查看跨用户访问尝试
grep '尝试操作其他用户' logs/xianyu_2025-07-25.log
```
### 4. 错误追踪
```bash
# 查看特定用户的错误
grep 'ERROR.*【admin#1】' logs/xianyu_2025-07-25.log
# 查看操作失败
grep '失败.*【.*】' logs/xianyu_2025-07-25.log
```
## 🔍 监控指标建议
### 1. 用户活跃度指标
- 每个用户的API调用频率
- 用户登录频率和时长
- 用户操作成功率
### 2. 安全监控指标
- 登录失败次数(按用户)
- 权限验证失败次数
- 跨用户访问尝试次数
### 3. 业务监控指标
- Cookie操作频率按用户
- 卡券创建和使用情况
- 用户设置修改频率
## 🚀 部署和使用
### 1. 立即生效
重启服务后,新的日志格式立即生效:
```bash
# 重启服务
docker-compose restart
# 查看新的日志格式
docker-compose logs -f | grep '【.*】'
```
### 2. 日志轮转配置
确保日志轮转能够处理增加的日志内容:
```python
# 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. **安全审计**: 定期检查权限验证失败和异常操作
---
**总结**: 通过本次改进,多用户系统的日志现在具备了完整的用户标识能力,大大提升了系统的可观测性和可维护性!