首页 > 其他分享 >fastapi 的uvicorn配置日志

fastapi 的uvicorn配置日志

时间:2024-07-31 17:28:32浏览次数:13  
标签:get default fastapi app uvicorn access 日志

  目前从flask框架转fastapi,之前flask框架日志很好用。这次学习了fastapi的日志使用,第一种是自定义日志,这个不讲了,自己封装就好,第二种是使用uvicorn自带日志, Uvicorn 是 fastapi 框架的默认ASGI服务器,它提供了强大的异步能力和高性能。

 

一、配置输出格式化

uvicorn 其实已经有日志,只是没有格式化输出,我们希望可以加点东西丰富输出。

找到 uvicorn.config 里的源码, LOGGING_CONFIG配置如下:

LOGGING_CONFIG: Dict[str, Any] = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(levelprefix)s %(message)s",
            "use_colors": None,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s',  # noqa: E501
        },
    },
    "handlers": {
        "default": {
            "formatter": "default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr",
        },
        "access": {
            "formatter": "access",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout",
        },
    },
    "loggers": {
        "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
        "uvicorn.error": {"level": "INFO"},
        "uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
    },
}

这段默认配置我们可以自定义,不过不是改源码,是初始化时加载我们新建的配置。比如在用 uvicorn 启动时,加上参数 log_config,uvicorn 自定义日志配置文件支持 json、yaml、ini 三种格式。

uvicorn.run(app='main:app',host="0.0.0.0",log_config='./uvicorn_config.json',port=8000,loop="asyncio")

以下这段 json 实现了,格式化输出控制台,日志输出到本地文件。首先创建 uvicorn_config.json 存放项目根目录:

{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(asctime)s %(threadName)s %(levelprefix)s  %(message)s",      # 增加了asctime和threadName
            "use_colors": null
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": "%(asctime)s %(threadName)s %(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s"  # 增加了asctime和threadName
        }
    },
    "handlers": {
        "default": {
            "formatter": "default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr"
        },
        # default日志输出到本地文件,定义了日志路径、备份数量
        "default_file": {
            "formatter": "default",
            "class": "logging.handlers.TimedRotatingFileHandler",
            "filename": "./logs/app.log",
            "when": "midnight",
            "encoding": "utf-8",
            "backupCount": 10
        },
        "access": {
            "formatter": "access",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout"
        },
        # access日志输出到本地文件,定义了日志路径、备份数量
        "access_file": {
            "formatter": "access",
            "class": "logging.handlers.TimedRotatingFileHandler",
            "filename": "./logs/app.log",
            "when": "midnight",
            "encoding": "utf-8",
            "backupCount": 10
                }
    },
    "loggers": {
        # 添加handler,default_file
        "uvicorn": {"handlers": ["default","default_file"], "level": "INFO", "propagate": false},
        "uvicorn.error": {"level": "INFO"},
        # 添加handler,access_file
        "uvicorn.access": {"handlers": ["access","access_file"], "level": "INFO", "propagate": false}
    }
}

 main.py文件

from api.aiserver_v3 import ai_server_v3
from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/home")
async def get():
    return {'message':'OK'}

@app.get("/test")
async def get():
    return {'message':'OK'}

@app.get("/dev")
async def get():
    return {'message':'OK'}


if __name__ == "__main__":
    uvicorn.run(app='main:app',host="0.0.0.0",log_config='./uvicorn_config.json',port=8000,loop="asyncio")

 运行main.py

控制台

app.log

 

二、业务代码调用 uvicorn 日志

查看 uvicorn 日志源码处理机制发现,本质上还是 logger.addHandler 方法添加 handler,所以可以用以下方法调用:

from api.aiserver_v3 import ai_server_v3
from fastapi import FastAPI
import uvicorn,logging

app = FastAPI()

log = logging.getLogger("uvicorn")


@app.get("/home")
async def get():
    log.info('this is a test')
    return {'message':'OK'}

@app.get("/test")
async def get():
    return {'message':'OK'}

@app.get("/dev")
async def get():
    return {'message':'OK'}


app.include_router(ai_server_v3,prefix='/ai',tags=['person'])


if __name__ == "__main__":
    uvicorn.run(app='main:app',host="0.0.0.0",log_config='./uvicorn_config.json',port=8000,loop="asyncio")

 输出:

标签:get,default,fastapi,app,uvicorn,access,日志
From: https://www.cnblogs.com/shenh/p/18335089

相关文章

  • pod日志采集-DaemonSet(ElFK方案)
    目录采集方案K8S-日志文件说明kafka部署operator部署opertor下载查看对应的版本选择.tgz下载安装2.资源清单下载下载对应版本的yaml清单解压yaml说明创建pvc/pv安装验证kafka-ui部署filebeat部署filebeat-rbac.yamlfilebeat-cm.yamlfilebeat-daemonset.yaml部署访问kafka数据验证l......
  • 如何在 FastAPI 中同时接收 JSON 数据和文件上传
    我正在开发一个FastAPI项目,我需要在同一请求中接收JSON数据和文件上传。具体来说,我需要在JSON数据中传递整数数组,同时上传文件。这是我的请求正文的样子:标题(字符串)描述(字符串)评论(字符串)due_date(日期)优先级(字符串)signed_to(数组)整......
  • Net8将Serilog日志推送ES,附视频
    这是一个Serilog的实践Demo,包括了区别记录存放,AOP日志记录,EF执行记录,并且将日志推送到ElasticSearch。说在前面的话自从AI出来之后,学习的曲线瞬间变缓了,学习的路径也有了很大的变化。与本人来说以前大多数都先知晓理论再找相关的框架官网或博客,然后去实践Demo,再加入到代码......
  • flask 框架日志
       除了自定义配置的log日志外,flask框架的有自己的日志处理机制,使用它的好处就是出现异常,即使没有捕获也能打印到日志里,方便定位问题。importsysfromlogging.handlersimportTimedRotatingFileHandlerfromloggingimportStreamHandlerfromloggingimportFormatter......
  • Qt程序中的日志记录Log4Qt
    一.为啥使用log4Qt?    1.与log4cpp的用法相似,支持配置文件。    2.可以输出qDebug(),qInfo()等等Qt自带的打印信息。二.工程地址MEONMedical/Log4Qt:Log4Qt-LoggingfortheQtcross-platformapplicationframework(github.com)        编译......
  • C# 日志
    本篇接扫log4net基本使用一、导包 二、配置文件Log4Net.config<?xmlversion="1.0"encoding="utf-8"?><configuration><configSections><sectionname="log4net"type="log4net.Config.Log4NetConf......
  • TFA-收集日志及分析
    下载https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=272133523880062&id=1513912.1&_afrWindowMode=0&_adf.ctrl-state=fghvcgapa_617a安装[root@rhel75~]#./ahf_setupAHFInstallerforPlatformLinuxArchitecturex86_64AHFIn......
  • 如何检查多个依赖项中是否至少有一个在 Fastapi 中传递
    我有一个端点应该适用于两个不同的用户组,如果用户不属于任一组,我想给出正确的错误消息。对于这些组,我创建了也在其他端点中使用的依赖项:defis_teacher(email:str=Depends(get_email),db=Depends(get_db))->bool:teacher=...ifnotteacher:......
  • 设置mybatis 是否打印日志
    @Bean(name="dbzyqsV102SqlSessionFactory")//@Qualifier表示查找Spring容器中名字为blogDataSource的对象publicSqlSessionFactorydbzyqsV102SqlSessionFactory(@Qualifier("dbzyqsV102DataSource")DataSourcedatasource)throwsEx......
  • 一篇文章搞懂docker日志的查看(转)
    命令docker查看容器日志使用的命令是:dockerlogs下面是dockerlogs的命令格式$dockerlogs[OPTIONS]CONTAINEROptions:--details显示更多的信息-f,--follow跟踪实时日志--sincestring显示自某个timestamp之后的日志,或相对时间,......