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

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)


控制台截图:

文件日志截图:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答您的问题。 首先,FastAPI 是一个高性能的 Web 框架,它使用 Python 语言编写,支持异步编程,可以让您快速地构建 API。 下面是一个简单的起手式,包括了 FastAPI 的主要特点和一些 Python 的基础知识: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q} ``` 这个简单的应用程序定义了两个路由:一个根路由和一个带有参数的路由。根路由返回一个 JSON 格式的消息,而带有参数的路由则返回一个包含参数和查询参数的 JSON 对象。 在上面的代码中,`@app.get("/")` 和 `@app.get("/items/{item_id}")` 是装饰器,它们告诉 FastAPI 如何处理路由。`async def root():` 和 `async def read_item(item_id: int, q: str = None):` 则是异步函数,它们处理了路由的逻辑。 其中,`root()` 函数返回一个 JSON 对象,其中包含一个名为 "message" 的键和一个值 "Hello World"。`read_item()` 函数则接受两个参数:一个名为 "item_id" 的整数和一个名为 "q" 的查询参数。它返回一个包含这两个参数的 JSON 对象。 使用 FastAPI,您可以轻松地构建具有多个路由和多个参数的复杂 API。同时,由于 FastAPI 是基于 Python 的,因此您可以使用 Python 的许多强大的工具和库来增强您的应用程序。 希望能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值