首页 > 其他分享 >FastAPI学习-29 uvicorn 使用 log_config 参数设置 logger 日志格式

FastAPI学习-29 uvicorn 使用 log_config 参数设置 logger 日志格式

时间:2024-01-22 10:06:29浏览次数:28  
标签:INFO LOGGING log FastAPI app uvicorn access 日志 参数设置

前言

FastAPI 服务是通过 uvicorn 来提供的,日志都是 uvicorn 里配置的。
官方文档地址:https://www.uvicorn.org/settings/#logging

uvicorn 的 logging 日志

我们可以通过 uvicorn.run() 方式启动服务

uvicorn.run("example:app", port=5000, reload=True, access_log=False)

于是可以加一些启动参数,与logging 日志相关的几个参数:

** --log-config<path> 日志配置文件。**
选项:dictConfig()格式:.json、.yaml。任何其他格式都将使用fileConfig()处理。
设置formatters.default.use_colors和formatters.access.use_cors值以覆盖自动检测的行为。
如果您希望在日志配置中使用YAML文件,则需要将PyYAML作为项目的依赖项,或者安装带有[标准]可选附加功能的uvicorn。

--log-level<str> 置日志级别。
选项:'critical', 'error', 'warning', 'info', 'debug', 'trace'。默认值:'info'。

--no-access-log

--use-colors/--no-use-colorss-启用/禁用日志记录的彩色格式,如果未设置此选项,则会自动检测到。如果使用--log-config CLI选项,则会忽略此选项。

启动服务

当我们启动服务,服务接口的时候,看到的日志是没有显示时间格式的

from fastapi import FastAPI




app = FastAPI()


@app.get("/demo/")
async def create_item():
    return {"demo": "hello world"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        app='main:app',
        host="127.0.0.1",
        reload=True,
        port=8000,
    )

运行日志

INFO:     Will watch for changes in these directories: ['D:\\code\\fast_project\\xxx']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [10924] using StatReload
INFO:     Started server process [5708]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:5161 - "GET / HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:5161 - "GET /docs HTTP/1.1" 200 OK
INFO:     127.0.0.1:5161 - "GET /demo HTTP/1.1" 307 Temporary Redirect
INFO:     127.0.0.1:5161 - "GET /demo/ HTTP/1.1" 200 OK

那么这些日志是从哪来的,又如何修改日志的默认格式呢?

LOGGING_CONFIG 日志默认格式

LOGGING_CONFIG 是uvicorn默认的日志配置

from uvicorn.config import 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},
    },
}

我们可以通过修改"formatters"默认的日志格式,来控制日志输出的格式

from fastapi import FastAPI
from uvicorn.config import LOGGING_CONFIG

LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelprefix)s %(message)s"

app = FastAPI()

······

于是就可以看到启动的日志,前面加上了时间"%(asctime)s"

2024-01-16 09:49:04,408 - INFO:     Will watch for changes in these directories: ['D:\\code\\fast_project\\xxx']
2024-01-16 09:49:04,408 - INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
2024-01-16 09:49:04,408 - INFO:     Started reloader process [9124] using StatReload
2024-01-16 09:49:04,924 - INFO:     Started server process [11020]
2024-01-16 09:49:04,924 - INFO:     Waiting for application startup.
2024-01-16 09:49:04,924 - INFO:     Application startup complete.

访问 http 接口的日志通过修改"access"格式来控制

from fastapi import FastAPI
from uvicorn.config import LOGGING_CONFIG

LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelprefix)s %(message)s"
LOGGING_CONFIG["formatters"]["access"]["fmt"] = "%(asctime)s - %(levelprefix)s %(client_addr)s - \"%(request_line)s\" %(status_code)s"

app = FastAPI()

FastAPI学习-29 uvicorn 使用 log_config 参数设置 logger 日志格式_ico

log_config 配置文件

前面是通过修改LOGGING_CONFIG 默认的参数来配置日志,我们也可以把配置文件单独写到一个uvicorn_config.json文件,加载本地配置文件覆盖默认的LOGGING_CONFIG
uvicorn_config.json

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "default": {
      "()": "uvicorn.logging.DefaultFormatter",
      "fmt": "%(asctime)s - %(levelprefix)s %(message)s",
      "use_colors": null
    },
    "access": {
      "()": "uvicorn.logging.AccessFormatter",
      "fmt": "%(asctime)s - %(levelprefix)s %(client_addr)s - \"%(request_line)s\" %(status_code)s"
    }
  },
  "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"
    },
    "uvicorn.error": {
      "level": "INFO"
    },
    "uvicorn.access": {
      "handlers": [
        "access"
      ],
      "level": "INFO",
      "propagate": false
    }
  }
}

启动时导入配置文件

from fastapi import FastAPI


app = FastAPI()


@app.get("/demo/")
async def create_item():
    return {"demo": "hello world"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        app='main:app',
        host="127.0.0.1",
        reload=True,
        port=8000,
        log_config="./uvicorn_config.json"
    )



标签:INFO,LOGGING,log,FastAPI,app,uvicorn,access,日志,参数设置
From: https://blog.51cto.com/u_15249893/9360657

相关文章

  • FastAPI学习-30 项目代码中添加自己的日志内容
    前言前面一篇【FastAPI学习-29uvicorn使用log_config参数设置logger日志格式】已经学会了配置uvicorn的日志。如何在fastapi项目代码中添加自己的日志呢?添加日志创建一个logger实例,名称为"fast"fromfastapiimportFastAPIimportlogginglogger=logging.getLogger(......
  • FastAPI学习-28 alembic数据迁移报错:Target database is not up to date 报错解决办法
    前言当表结构有变更,数据迁移时,出现报错:Targetdatabaseisnotuptodate遇到的问题执行迁移命令alembicrevision--autogenerate-m"testv4"出现如下报错>alembicrevision--autogenerate-m"testv4"INFO[alembic.runtime.migration]ContextimplMySQLImpl.INFO[alem......
  • 新品来袭,全国产ARM+FPGA--"RK3568J+Logos-2"工业核心板,让您的硬件设计“更简单”!
    如需选购,请登录创龙科技天猫旗舰店:tronlong.tmall.com!欢迎加入RK3568J技术交流群:567208221欢迎加入Logos-2技术交流群:311416997更多产品详情以及购买咨询可添加如下客服人员微信(即刻添加,马上咨询) 更多RK3568J+Logos-2产品资料可长按二维码识别下载  ......
  • m基于FPGA的Hamming汉明编译码verilog实现,包含testbench测试文件,不使用IP核
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,测试结果如下:2.算法涉及理论知识概要在现代数字通信和存储系统中,错误检测和纠正(ErrorDetectionandCorrection,EDC)机制是至关重要的。Hamming码,以其发明者RichardHamming命名,是一种线性错误检测和纠正码,广泛应用于这些系......
  • python3使用socket模块实现简易syslog服务器
    废话不多说直接上代码1importsocket2importtime345defsocket_bind(server_socket,host,port=514,max_retries=5):6retries=07whileretries<max_retries:8try:9server_socket.bind((host,port))10......
  • 《the psychology of money》金钱心理学-英文原版书籍-读书笔记
    ————————————————————introduction————————————————————2024.01.20尽管我们周围的世界充满了明显的事物和现象,但人们往往忽视它们“softskills”financialsuccessisnotahardscience.Itisasoftskill,wherehowyoube......
  • fastapi集成google auth登录
    title:fastapi集成googleauth登录banner_img:https://cdn.studyinglover.com/pic/2024/01/cabc8955c76fb9f396061cbbdd5aad58.pngindex_img:https://cdn.studyinglover.com/pic/2024/01/ae35717c51d89eb88ab6852b4b00ef63.pngdate:2024-1-2110:26:00tags:-googleauth......
  • 使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kiba
    前言ELK是指Elasticsearch、Logstash和Kibana这三个开源软件的组合。Elasticsearch是一个分布式的搜索和分析引擎,用于日志的存储,搜索,分析,查询。Logstash是一个数据收集、转换和传输工具,用于收集过滤和转换数据,然后将其发送到Elasticsearch或其他目标存储中。Kiba......
  • fastapi项目 09-阿里云服务部署fastapi项目
    安装docker按照官方文档的流程来。1.卸载旧版本yumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • 利用topologySpreadConstraints使多个Pod在节点之间均衡调度
    在ingress-nginx部署时有个需求,就是3个节点单个节点需要至少跑3个实例。这需求有点像异地多活时,每个区域至少要跑2实例一样,不同之处是一个是节点级别,一个是区域级别。deployment在副本数多的时候虽然可以让调度器大致上的平均调度,但是当遇到个别节点压力大的时候会降低调度score......