fastapi 日志配置

需求

配置日志文件,需要将日志信息 输出到终端调试,且还需要将输出的日志 写入 .log 日志文件中

方案(直接看代码):

import uvicorn
from fastapi import FastAPI
from app.routes import test_routes, users

# -------------定义日志配置 start----------------
# 日志配置可以独立放到自己的 logger_setting.py 配置文件

import logging
import os


# 确保日志目录存在
os.makedirs("logs", exist_ok=True)
log_file = "logs/app.log"

# 检查并删除已存在的日志文件
if os.path.exists(log_file):
    try:
        os.remove(log_file)
    except Exception as e:
        _ = e


log_config = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(asctime)s - %(levelprefix)s %(message)s",
            "use_colors": True,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(asctime)s - %(client_addr)s - %(levelprefix)s "%(request_line)s" %(status_code)s',  # noqa: E501
            "use_colors": True,
        },
        "log_default": {
                    "()": "uvicorn.logging.DefaultFormatter",
                    "fmt": "%(asctime)s - %(levelprefix)s %(message)s",
                    "use_colors": False,
                },
        "log_access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(asctime)s - %(client_addr)s - %(levelprefix)s "%(request_line)s" %(status_code)s',  # noqa: E501
            "use_colors": False,
        },
    },
    "handlers": {
        "default": {
            "formatter": "default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr",
        },
        "access": {
            "formatter": "access",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout",
        },
        "default_log": {
            "formatter": "log_default",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": f"{log_file}",
            "maxBytes": 1024 * 1024 * 5,
            "backupCount": 5,
            "encoding": "utf-8",
        },
        "access_log": {
            "formatter": "log_access",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": f"{log_file}",
            "maxBytes": 1024 * 1024 * 5,
            "backupCount": 5,
            "encoding": "utf-8",
        },
    },
    "loggers": {
        "uvicorn": {"handlers": ["default", "default_log"], "level": "INFO", "propagate": False},
        "uvicorn.error": {"level": "INFO"},
        "uvicorn.access": {"handlers": ["access", "access_log"], "level": "INFO", "propagate": False},
    },
}

logger = logging.getLogger("uvicorn")

# -------------定义日志配置 end----------------

# 注册APIRouter路由
app.include_router(test_routes.router, tags=["test模块"])


# 启动参数
parser = argparse.ArgumentParser(description='启动参数')
parser.add_argument('-p', '--port', type=int, help='端口号', default=8000)
args = parser.parse_args()


app = FastAPI()
if __name__ == "__main__":
    logger.info(f"日志打印: running service")
    uvicorn.run(app, host="127.0.0.1", port=args.port, log_config=log_config)
posted @ 2025-08-04 22:05  二月雪  阅读(60)  评论(0)    收藏  举报