python fastapi + uvicorn 记录日志的最佳实践,结合nb_log

本文档展示了如何在FastAPI应用中结合uvicorn和nb_log库来实现日志记录,特别是针对请求URL和参数的记录。通过定制logging.config.dictConfig,配置控制台和文件日志,包括多进程安全的日志切割。示例代码详细说明了如何设置日志格式、处理器和handler,确保uvicorn的日志在控制台和文件中都有详细记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python fastapi + uvicorn 记录日志的最佳实践,要记录对fastapi什么时候请求了什么url和入参,只需要记录uvicorn命名空间的日志就可以了。

文章使用nb_log 五彩日志来记录web后台的控制台日志 + 多进程安全切割的文件日志。

为什么不能nb_log.get_logger提前设置好相关命名空间的日志formatter和handlers呢?因为他是在函数内部里面运行的 
D:\ProgramData\Miniconda3\Lib\site-packages\uvicorn\config.py 函数内部中logging.config.dictConfig配置的,所以需要传递log_config

fastapiweb222.py  文件内容。
from pathlib import Path

from fastapi import FastAPI
import nb_log

app = FastAPI()


@app.get("/")
async def hello_world():
    return "Hello, World!"


LOG_FILE_PATH = '/pythonlogs'
LOGGING_CONFIG: dict = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(asctime)s %(levelprefix)s %(message)s",  # 这里日志格式加了时间显示
            "use_colors": False,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(name)s %(asctime)s %(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s',
            # 这里日志格式加了时间显示
        },
    },
    "handlers": {
        "default": {
            "formatter": "default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr",
        },
        # "default_file": {
        #     "formatter": "default",
        #     "class": "nb_log.handlers.ConcurrentRotatingFileHandler",  # 注意这里是多进程安全切割日志
        #     'filename': Path(LOG_FILE_PATH) / 'uvicorn_default.log',
        #     'maxBytes': 1000 * 1000 * 100,
        #     'backupCount': 3,
        # },
        "default_file": {
            "formatter": "default",
            "class": "nb_log.handlers.BothDayAndSizeRotatingFileHandler",  # 注意这里是多进程安全切割日志
            'file_name': 'uvicorn_default.log',
            'log_path': LOG_FILE_PATH,
            'max_bytes': 1000 * 1000 * 1000,
            'back_count': 10,

        },

        "access": {
            "formatter": "access",
            "class": "nb_log.handlers.ColorHandler",  # 这里用了nb_log的彩色控制台handler。
        },
        # "access_file": {
        #     "formatter": "access",
        #     "class": "nb_log.handlers.ConcurrentRotatingFileHandler",  # 注意这里是多进程安全切割日志
        #     'filename': Path(LOG_FILE_PATH) / 'uvicorn_access.log',
        #     'maxBytes': 1000 * 1000 * 100,
        #     'backupCount': 3,
        # },
        "access_file": {
            "formatter": "access",
             "class": "nb_log.handlers.BothDayAndSizeRotatingFileHandler",  # 注意这里是多进程安全切割日志
            'file_name': 'uvicorn_access.log',
            'log_path': LOG_FILE_PATH,
            'max_bytes': 1000 * 1000 * 1000,
            'back_count': 10,
        },
    },
    "loggers": {
        "uvicorn": {"handlers": ["default", "default_file"], "level": "INFO"},
        "uvicorn.error": {"level": "INFO"},
        "uvicorn.access": {"handlers": ["access", "access_file"], "level": "INFO", "propagate": False},
    },
}

if __name__ == "__main__":
    import uvicorn

    uvicorn.run('nb_http_client.tests.fastapi_server:app', host="0.0.0.0", port=8008, workers=2,log_config=LOGGING_CONFIG)


控制台截图:

文件日志截图:

### 如何配置 FastAPI 示例教程最佳实践 #### 项目目录结构及介绍 为了创建一个遵循最佳实践FastAPI 应用程序,建议采用清晰且有条理的项目结构。典型的项目布局可能包括以下几个部分[^1]: - `app`: 主应用程序文件夹,包含核心逻辑。 - `main.py`: 启动入口点。 - `routers/`: 存放不同功能模块对应的路由定义。 - `example_router.py` - `models/`: 数据库模型定义位置。 - `schemas/`: Pydantic 模型用于请求响应验证。 - `dependencies/`: 常见依赖注入组件。 #### 配置 Uvicorn 运行服务器 对于本地开发环境来说,可以简单地通过命令行启动 Uvicorn 来运行 FastAPI 应用。这种方式非常适合于快速测试和调试阶段[^2]: ```bash uvicorn app.main:app --reload ``` #### 日志记录设置 针对生产环境中更为严格的要求,在 FastAPI 中集成 nb_log 是一种有效的方法来实现全面的日志管理方案。这不仅能够捕获来自各个层次的信息,还能方便后续分析与排查问题所在[^3]: ```python from fastapi import FastAPI, Request import logging.config import nb_log logging_config = { 'version': 1, 'disable_existing_loggers': False, 'formatters': {'default': {'format': '%(asctime)s %(levelname)s:%(name)s:%(message)s'}}, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'default' }, 'file_handler': { 'class': 'nb_log.handlers.NBFileHandler', 'filename': './logs/app.log', 'encoding': 'utf8', 'formatter': 'default' } }, 'loggers': { '': { # root logger 'level': 'INFO', 'handlers': ['console', 'file_handler'] } } } logging.config.dictConfig(logging_config) app = FastAPI() logger = logging.getLogger(__name__) @app.get("/") async def read_root(): logger.info("Accessing the home page.") return {"Hello": "World"} ``` #### 处理时区相关事项 当涉及到跨区域的时间戳操作时,应该始终考虑使用 UTC 时间作为存储标准,并仅在展示给最终用户之前才转换成目标地区的当地时间。此外,还需注意数据库连接字符串中指定字符集参数的重要性,以确保正确处理多字节字符[^4]: ```python from datetime import datetime, timezone from pytz import utc current_time_utc = datetime.now(timezone.utc).astimezone(tz=utc) print(current_time_utc.strftime('%Y-%m-%d %H:%M:%S')) ```
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值