logger.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import logging
  2. import json
  3. from datetime import datetime
  4. import os
  5. from typing import Dict, Any
  6. from pathlib import Path
  7. # 确保日志目录存在
  8. LOG_DIR = Path("chat_logs")
  9. LOG_DIR.mkdir(exist_ok=True)
  10. # 详细日志目录结构
  11. DETAILED_LOG_DIR = LOG_DIR / "detailed"
  12. DETAILED_LOG_DIR.mkdir(exist_ok=True)
  13. # 配置日志
  14. def setup_logging():
  15. """配置日志系统"""
  16. # 主日志记录器
  17. logger = logging.getLogger("chat_logger")
  18. logger.setLevel(logging.INFO)
  19. # 避免重复添加handler
  20. if not logger.handlers:
  21. # 文件处理器 - 按天分割
  22. log_file = LOG_DIR / f"chat_{datetime.now().strftime('%Y%m%d')}.log"
  23. file_handler = logging.FileHandler(log_file, encoding="utf-8")
  24. file_handler.setLevel(logging.INFO)
  25. # 控制台处理器
  26. console_handler = logging.StreamHandler()
  27. console_handler.setLevel(logging.INFO)
  28. # 格式化
  29. formatter = logging.Formatter(
  30. "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
  31. datefmt="%Y-%m-%d %H:%M:%S",
  32. )
  33. file_handler.setFormatter(formatter)
  34. console_handler.setFormatter(formatter)
  35. logger.addHandler(file_handler)
  36. logger.addHandler(console_handler)
  37. return logger
  38. # 初始化日志
  39. chat_logger = setup_logging()
  40. def get_detailed_log_path(user_id: str, timestamp: datetime = None) -> Path:
  41. """
  42. 获取详细日志文件的路径
  43. 格式: chat_logs/detailed/YYYYMMDD/user_id_YYYYMMDD_HHMMSS.json
  44. """
  45. if timestamp is None:
  46. timestamp = datetime.now()
  47. # 按日期创建目录
  48. date_str = timestamp.strftime("%Y%m%d")
  49. date_dir = DETAILED_LOG_DIR / date_str
  50. date_dir.mkdir(exist_ok=True)
  51. # 生成文件名
  52. filename = f"{user_id}_{timestamp.strftime('%Y%m%d_%H%M%S')}.json"
  53. return date_dir / filename
  54. def log_chat_entry(user_id: str, user_message: str, agent_response: Dict[str, Any]):
  55. """记录完整的对话日志"""
  56. try:
  57. timestamp = datetime.now()
  58. log_entry = {
  59. "timestamp": timestamp.isoformat(),
  60. "user_id": user_id,
  61. "user_message": user_message,
  62. "agent_response": {
  63. "final_answer": agent_response.get("final_answer", ""),
  64. "all_ai_messages_count": len(agent_response.get("all_ai_messages", [])),
  65. "all_messages_count": len(agent_response.get("all_messages", [])),
  66. "tool_calls_count": len(agent_response.get("tool_calls", [])),
  67. },
  68. "all_messages": [
  69. {
  70. "type": msg.get("type"),
  71. "content": msg.get("content", "")[:500], # 限制长度
  72. "tool_calls": msg.get("tool_calls"),
  73. "index": msg.get("index"),
  74. }
  75. for msg in agent_response.get("all_messages", [])
  76. ],
  77. "tool_calls": agent_response.get("tool_calls", []),
  78. }
  79. # 记录到日志文件
  80. chat_logger.info(f"对话记录 - Thread: {user_id}")
  81. chat_logger.info(f"用户消息: {user_message}")
  82. chat_logger.info(
  83. f"Agent响应: {agent_response.get('final_answer', '')[:200]}..."
  84. )
  85. # 保存详细日志到单独文件
  86. detailed_log_file = get_detailed_log_path(user_id, timestamp)
  87. with open(detailed_log_file, "w", encoding="utf-8") as f:
  88. json.dump(log_entry, f, ensure_ascii=False, indent=2)
  89. chat_logger.info(f"详细日志已保存到: {detailed_log_file}")
  90. except Exception as e:
  91. chat_logger.error(f"记录日志时出错: {str(e)}")