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)