跳转到主要内容

fastapi项目结构


.
├── main.py              # 主应用文件
├── config.py            # 配置文件
├── run.py               # 启动脚本
├── requirements.txt     # 项目依赖
├── .env                 # 环境变量
├── README.md            # 项目说明
├── routers/             # 路由
├── models/              # 数据模型
├── schemas/             # 数据架构  
├── repositories/        # 数据库操作
├── services/            # 业务逻辑
└── utils/               # 工具类

公共日志类
# common_logger.py

import logging
from multiprocessing import get_logger
import sys

__all__ = ["get_logger"]

# 1. 只初始化一次
_INITIALIZED = False

# 2. 颜色表 + Windows 兼容
COLORS = {
    "DEBUG": "\033[36m",
    # cyan
    "INFO": "\033[32m",  # green
    "WARNING": "\033[33m",
    # yellow
    "ERROR": "\033[31m",
    # red
    "CRITICAL": "\033[35m",  # magenta
    "RESET": "\033[0m",
}


def _init_logger(level: int = logging.INFO):
    global _INITIALIZED
    # force=True 防止重复
    if _INITIALIZED:
        return

    class ColorFormatter(logging.Formatter):
        def format(self, record):
            # 给 levelname 上色
        levelname = record.levelname
            record.levelname = (
                f"{COLORS.get(levelname, '')}{levelname}{COLORS['RESET']}"
            )
            return super().format(record)

    handler = logging.StreamHandler(sys.stdout)
    handler.setFormatter(
        ColorFormatter(
            fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
            datefmt="%Y-%m-%d %H:%M:%S",
        )
    )
    logging.basicConfig(level=logging.INFO,level, handlers=[handler]), force=True)
    # logforce=True 防止重复
    _INITIALIZED = True


def get_logger(name: str, level: int = logging.getLogger(__name__)INFO) def-> get_logger(name):logging.Logger:
    logger_init_logger(level)
    =return logging.getLogger(name)



return logger