logger.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """
  2. 日志配置
  3. 支持admin和client接口日志分离
  4. """
  5. import sys
  6. from pathlib import Path
  7. from loguru import logger as loguru_logger
  8. from app.config import settings
  9. # 创建日志目录
  10. log_dir = Path("logs")
  11. log_dir.mkdir(exist_ok=True)
  12. # 移除默认处理器
  13. loguru_logger.remove()
  14. # 控制台输出 - 优化API出入参显示
  15. loguru_logger.add(
  16. sys.stderr,
  17. format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
  18. level=settings.LOG_LEVEL,
  19. colorize=True,
  20. )
  21. # 默认文件输出(保留,用于其他日志)
  22. loguru_logger.add(
  23. log_dir / "app_{time:YYYY-MM-DD}.log",
  24. rotation="00:00",
  25. retention="30 days",
  26. format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
  27. level="DEBUG",
  28. encoding="utf-8",
  29. )
  30. # Admin专用文件处理器
  31. admin_handler_id = loguru_logger.add(
  32. log_dir / "admin_{time:YYYYMMDD}.log",
  33. rotation="00:00",
  34. retention="30 days",
  35. format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
  36. level="DEBUG",
  37. encoding="utf-8",
  38. filter=lambda record: record["extra"].get("admin_interface") is True
  39. )
  40. # Client专用文件处理器
  41. client_handler_id = loguru_logger.add(
  42. log_dir / "client_{time:YYYYMMDD}.log",
  43. rotation="00:00",
  44. retention="30 days",
  45. format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
  46. level="DEBUG",
  47. encoding="utf-8",
  48. filter=lambda record: record["extra"].get("client_interface") is True
  49. )
  50. def setup_logger():
  51. """设置日志"""
  52. return loguru_logger
  53. def get_admin_logger():
  54. """获取admin接口专用logger"""
  55. return loguru_logger.bind(admin_interface=True)
  56. def get_client_logger():
  57. """获取client接口专用logger"""
  58. return loguru_logger.bind(client_interface=True)
  59. def get_logger_by_path(path: str):
  60. """
  61. 根据请求路径返回对应的logger
  62. /admin/* -> admin_logger
  63. /api/* -> client_logger
  64. 其他 -> 默认logger
  65. """
  66. if path.startswith("/admin/"):
  67. return loguru_logger.bind(admin_interface=True)
  68. elif path.startswith("/api/"):
  69. return loguru_logger.bind(client_interface=True)
  70. else:
  71. return loguru_logger
  72. # 向后兼容:保留logger名称供现有代码使用
  73. logger = loguru_logger