logger.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. """对话日志系统"""
  2. import logging
  3. import os
  4. from datetime import datetime
  5. from pathlib import Path
  6. # 创建logs目录
  7. LOGS_DIR = Path(__file__).parent / "logs"
  8. LOGS_DIR.mkdir(exist_ok=True)
  9. # 创建日志文件名 (按日期)
  10. today = datetime.now().strftime("%Y-%m-%d")
  11. LOG_FILE = LOGS_DIR / f"dialogue_{today}.log"
  12. # 配置日志格式
  13. LOG_FORMAT = "%(asctime)s - %(message)s"
  14. DATE_FORMAT = "%H:%M:%S"
  15. # 创建logger
  16. dialogue_logger = logging.getLogger("dialogue")
  17. dialogue_logger.setLevel(logging.INFO)
  18. # 移除已有的handlers (避免重复)
  19. dialogue_logger.handlers.clear()
  20. # 创建文件handler
  21. file_handler = logging.FileHandler(LOG_FILE, encoding="utf-8")
  22. file_handler.setLevel(logging.INFO)
  23. file_handler.setFormatter(logging.Formatter(LOG_FORMAT, DATE_FORMAT))
  24. # 创建控制台handler
  25. console_handler = logging.StreamHandler()
  26. console_handler.setLevel(logging.INFO)
  27. console_handler.setFormatter(logging.Formatter(LOG_FORMAT, DATE_FORMAT))
  28. # 添加handlers
  29. dialogue_logger.addHandler(file_handler)
  30. dialogue_logger.addHandler(console_handler)
  31. # 防止日志传播到root logger
  32. dialogue_logger.propagate = False
  33. def log_dialogue_start(npc_name: str, player_message: str):
  34. """记录对话开始"""
  35. dialogue_logger.info("=" * 60)
  36. dialogue_logger.info(f"💬 对话开始: {npc_name} <-> 玩家")
  37. dialogue_logger.info("=" * 60)
  38. dialogue_logger.info(f"📝 玩家消息: {player_message}")
  39. def log_affinity(npc_name: str, affinity: float, level: str):
  40. """记录当前好感度"""
  41. dialogue_logger.info(f"💖 当前好感度: {affinity:.1f}/100 ({level})")
  42. def log_memory_retrieval(npc_name: str, count: int, memories: list = None):
  43. """记录记忆检索"""
  44. dialogue_logger.info(f"🧠 检索到{count}条相关记忆")
  45. if memories:
  46. dialogue_logger.info(" 📚 相关记忆:")
  47. for i, mem in enumerate(memories[:3], 1):
  48. content = mem.content[:50] + "..." if len(mem.content) > 50 else mem.content
  49. dialogue_logger.info(f" {i}. {content}")
  50. def log_generating_response():
  51. """记录正在生成回复"""
  52. dialogue_logger.info("🤖 正在生成回复...")
  53. def log_npc_response(npc_name: str, response: str):
  54. """记录NPC回复"""
  55. dialogue_logger.info(f"💬 {npc_name}回复: {response}")
  56. def log_analyzing_affinity():
  57. """记录正在分析好感度"""
  58. dialogue_logger.info("📊 正在分析好感度变化...")
  59. def log_affinity_change(affinity_result: dict):
  60. """记录好感度变化"""
  61. if affinity_result.get("changed"):
  62. change_symbol = "📈" if affinity_result["change_amount"] > 0 else "📉"
  63. dialogue_logger.info(
  64. f"{change_symbol} 好感度变化: {affinity_result['old_affinity']:.1f} -> "
  65. f"{affinity_result['new_affinity']:.1f} ({affinity_result['change_amount']:+.1f})"
  66. )
  67. dialogue_logger.info(f" 原因: {affinity_result['reason']}")
  68. dialogue_logger.info(f" 情感: {affinity_result['sentiment']}")
  69. if affinity_result['old_level'] != affinity_result['new_level']:
  70. dialogue_logger.info(
  71. f" 🎉 关系等级变化: {affinity_result['old_level']} -> {affinity_result['new_level']}"
  72. )
  73. else:
  74. dialogue_logger.info(f" ➡️ 好感度未变化 (当前: {affinity_result.get('affinity', 50.0):.1f})")
  75. dialogue_logger.info(f" 原因: {affinity_result.get('reason', '无')}")
  76. def log_memory_saved(npc_name: str):
  77. """记录记忆保存"""
  78. dialogue_logger.info(f" 💾 对话已保存到{npc_name}的记忆中")
  79. def log_dialogue_end():
  80. """记录对话结束"""
  81. dialogue_logger.info("=" * 60)
  82. dialogue_logger.info("✅ 对话完成\n")
  83. def log_info(message: str):
  84. """记录普通信息"""
  85. dialogue_logger.info(message)
  86. def log_error(message: str):
  87. """记录错误信息"""
  88. dialogue_logger.error(message)
  89. # 启动时记录日志文件位置
  90. print(f"\n📝 对话日志文件: {LOG_FILE}")
  91. print(f"📂 日志目录: {LOGS_DIR}\n")