import uvicorn
from uvicorn.config import LOGGING_CONFIG
if __name__ == "__main__":
# 修改默认日志配置
LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelname)s - %(message)s"
LOGGING_CONFIG["formatters"]["default"]["datefmt"] = "%Y-%m-%d %H:%M:%S"
LOGGING_CONFIG["formatters"]["access"][
"fmt"
] = '%(asctime)s - %(levelname)s - %(client_addr)s - "%(request_line)s" %(status_code)s'
LOGGING_CONFIG["formatters"]["access"]["datefmt"] = "%Y-%m-%d %H:%M:%S"
uvicorn.run("app:app", host="0.0.0.0", port=9999, reload=True, log_config=LOGGING_CONFIG)
一、代码目的
这段代码是使用 uvicorn 启动一个 FastAPI 应用(假设 “app” 是一个 FastAPI 应用实例)。它修改了 uvicorn 的默认日志配置,以满足特定的日志记录需求,并设置了应用运行的主机、端口以及开启自动重载功能。
二、代码详细解析
-
导入 uvicorn 和其日志配置
-
import uvicorn
:导入 uvicorn 模块,uvicorn 是一个 Python 的 ASGI 服务器,用于运行支持 ASGI 协议的 Web 应用,像 FastAPI 应用就符合这种协议。 -
from uvicorn.config import LOGGING_CONFIG
:从 uvicorn 的配置模块中导入默认的日志配置。这使我们能够获取 uvicorn 自身的日志记录相关的配置参数,以便进行修改。
-
-
修改日志配置
-
LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelname)s - %(message)s"
:修改默认的日志格式。这里将日志的格式设置为显示时间、日志级别和日志消息。其中,%(asctime)s
表示时间,%(levelname)s
表示日志级别(如 DEBUG、INFO、WARNING 等),%(message)s
表示具体的日志消息内容。 -
LOGGING_CONFIG["formatters"]["default"]["datefmt"] = "%Y-%m-%d %H:%M:%S"
:设置时间的显示格式为 “年 - 月 - 日 时:分:秒”。 -
对 “access”(访问)日志格式的修改类似。
LOGGING_CONFIG["formatters"]["access"]["fmt"]
添加了客户端地址(%(client_addr)s
)和请求行(%(request_line)s
)以及状态码(%(status_code)s
)信息,这样可以更详细地记录每次 HTTP 请求相关的信息。
-
-
启动 uvicorn 服务器
uvicorn.run("app:app", host="0.0.0.0", port=9999, reload=True, log_config=LOGGING_CONFIG)
:-
"app:app"
表示要运行的应用模块和应用实例名称。假设在 “app.py” 文件中定义了一个名为 “app” 的 FastAPI 应用实例。 -
host="0.0.0.0"
:设置服务器监听的主机地址为 “0.0.0.0”,这意味着服务器会监听所有可用的网络接口,外部设备可以通过局域网 IP 地址访问该应用(在实际开发环境中,这样设置方便在不同设备上测试应用)。 -
port=9999
:指定应用运行的端口号为 9999。当你在浏览器或其他客户端访问该应用时,需要在主机地址后面加上这个端口号,例如 “http://localhost:9999”。 -
reload=True
:开启自动重载功能。在开发过程中,当你对代码进行修改并保存后,uvicorn 会自动检测到文件变化并重启服务器,这样可以方便地看到修改后的效果而无需手动重启服务器。 -
log_config=LOGGING_CONFIG
:将之前修改后的日志配置应用到 uvicorn 服务器上,使得服务器运行时按照新的日志格式记录日志信息。
-
三、实用开发技巧
-
环境分离配置:在实际开发中,建议使用环境变量来区分开发环境、测试环境和生产环境的配置。例如,可以使用 python --dotenv 库加载环境变量文件(.env)。对于 uvicorn 的配置,如主机、端口、是否开启自动重载等参数,可以通过环境变量来设置,这样在不同环境下可以灵活切换配置,避免手动修改代码中的配置值带来的错误和不便。
-
日志管理:除了修改 uvicorn 的日志格式外,还可以考虑将日志输出到文件而不是仅仅在控制台显示。可以通过配置日志处理器(handler)来实现,例如使用 FileHandler 将日志写入到指定的文件中,同时可以设置日志文件的大小限制、备份策略等,以便更好地管理和分析日志信息,尤其是在应用运行出现异常或者需要排查问题时,方便查看历史日志记录。
优化代码:
import uvicorn
from uvicorn.config import LOGGING_CONFIG
from dotenv import load_dotenv
import os
import logging
from logging.handlers import RotatingFileHandler
# 加载环境变量
load_dotenv()
if __name__ == "__main__":
# 从环境变量获取 uvicorn 配置
host = os.getenv("UVICORN_HOST", "127.0.0.1") # 默认值为 "127.0.0.1"
port = int(os.getenv("UVICORN_PORT", 8000)) # 默认值为 8000
reload = os.getenv("UVICORN_RELOAD", "False").lower() == "true" # 默认值为 False
# 获取默认的日志配置
logging_config = LOGGING_CONFIG.copy()
# 修改默认日志格式
logging_config["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelname)s - %(message)s"
logging_config["formatters"]["default"]["datefmt"] = "%Y-%m-%d %H:%M:%S"
logging_config["formatters"]["access"]["fmt"] = '%(asctime)s - %(levelname)s - %(client_addr)s - "%(request_line)s" %(status_code)s'
logging_config["formatters"]["access"]["datefmt"] = "%Y-%m-%d %H:%M:%S"
# 添加文件日志处理器(handler)
log_file = "app.log" # 日志文件名
rotating_handler = {
"class": "logging.handlers.RotatingFileHandler",
"filename": log_file,
"maxBytes": 1024 * 1024 * 5, # 每个日志文件最大 5MB
"backupCount": 3, # 保留 3 个备份文件
"formatter": "default",
"encoding": "utf8"
}
# 将文件处理器添加到日志配置中
logging_config["handlers"]["file"] = rotating_handler
# 更新日志记录器(logger)的处理器配置,使其使用文件处理器
for logger_name in logging_config["loggers"]:
logging_config["loggers"][logger_name]["handlers"].append("file")
# 启动 uvicorn 服务器
uvicorn.run(
"app:app", # 假设 FastAPI 应用实例在 app.py 文件中,名为 app
host=host,
port=port,
reload=reload,
log_config=logging_config
)