修改uvicorn默认日志格式

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 的默认日志配置,以满足特定的日志记录需求,并设置了应用运行的主机、端口以及开启自动重载功能。

二、代码详细解析

  1. 导入 uvicorn 和其日志配置

    • import uvicorn:导入 uvicorn 模块,uvicorn 是一个 Python 的 ASGI 服务器,用于运行支持 ASGI 协议的 Web 应用,像 FastAPI 应用就符合这种协议。

    • from uvicorn.config import LOGGING_CONFIG从 uvicorn 的配置模块中导入默认的日志配置。这使我们能够获取 uvicorn 自身的日志记录相关的配置参数,以便进行修改。

  2. 修改日志配置

    • 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 请求相关的信息

  3. 启动 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 服务器上,使得服务器运行时按照新的日志格式记录日志信息。

三、实用开发技巧

  1. 环境分离配置:在实际开发中,建议使用环境变量来区分开发环境、测试环境和生产环境的配置。例如,可以使用 python --dotenv 库加载环境变量文件(.env)。对于 uvicorn 的配置,如主机、端口、是否开启自动重载等参数,可以通过环境变量来设置,这样在不同环境下可以灵活切换配置,避免手动修改代码中的配置值带来的错误和不便。

  2. 日志管理:除了修改 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
    )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值