成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為 FastAPI 配置日志的三種方法

開發 前端
本文分享了 FastAPI 配置日志的三種方法,后兩種其實是 uvicorn 配置并記錄日志的方法,

你好,我是 somenzz,可以叫我征哥,最近在用 FastAPI 的時候,發現 FastAPI 的官方文檔沒有配置日志的相關說明,今天就分享一下 FastAPI 配置日志的三種方法。

第一種,就像寫腳本那樣記錄日志

這一種方法最簡單直接,平時寫腳本的時候怎么記錄日志,這里就怎么記錄日志,通常就是先配置日志格式,然后在需要的地方 logger.info 一下:

配置日志:

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
fh = logging.FileHandler(filename='./server.log')
formatter = logging.Formatter(
"%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s - %(message)s"
)

ch.setFormatter(formatter)
fh.setFormatter(formatter)
logger.addHandler(ch) #將日志輸出至屏幕
logger.addHandler(fh) #將日志輸出至文件

如果怕文件太大,可以使用循環日志:

fh = logging.handlers.RotatingFileHandler("api.log",mode="a",maxBytes = 100*1024, backupCount = 3)

然后,在需要記錄日志的地方添加 logger.info / logger.warning / logger.debug / logger.error

from fastapi import FastAPI

# setup loggers
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
fh = logging.FileHandler(filename='./server.log'))
ch.setFormatter(LogFormatter())
fh.setFormatter(LogFormatter())
logger.addHandler(ch) #將日志輸出至屏幕
logger.addHandler(fh) #將日志輸出至文件



app = FastAPI()

@app.get("/")
async def root():
logger.info("logging from the root logger")
return {"status": "alive"}

你可能會說,我接口特別多,難道一行一行加?

那也不用,你可以在中間件里面攔截所有請求,然后日志記錄每一個請求,完整代碼如下所示:

文件名 main.py,重點在 log_requests 函數:

import logging
from fastapi import FastAPI
import time
import random
import string

logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
fh = logging.FileHandler(filename='./server.log')
formatter = logging.Formatter(
"%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s - %(message)s"
)

ch.setFormatter(formatter)
fh.setFormatter(formatter)
logger.addHandler(ch) #將日志輸出至屏幕
logger.addHandler(fh) #將日志輸出至文件


logger = logging.getLogger(__name__)

app = FastAPI()

@app.middleware("http")
async def log_requests(request, call_next):
idem = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))
logger.info(f"rid={idem} start request path={request.url.path}")
start_time = time.time()

response = await call_next(request)

process_time = (time.time() - start_time) * 1000
formatted_process_time = '{0:.2f}'.format(process_time)
logger.info(f"rid={idem} completed_in={formatted_process_time}ms status_code={response.status_code}")

return response


@app.get("/")
async def root():
return {"status": "alive"}

命令行 uvicorn main:app --host 0.0.0.0 --port 8081 然后訪問一下 http://localhost:8081,就會看到日志輸出,同時會保存在 server.log 文件中:

第二種,記錄 uvicorn 的日志

fastapi 其實是 uvicorn 驅動的,uvicorn 本身就會在終端輸出信息:

? uvicorn main:app --host 0.0.0.0 --port 8081
INFO: Started server process [88064]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)

將這些信息記錄到文件里就可以了,可以在 fastapi 啟動的時候配置:

@app.on_event("startup")
async def startup_event():
logger = logging.getLogger("uvicorn.access")
handler = logging.handlers.RotatingFileHandler("api.log",mode="a",maxBytes = 100*1024, backupCount = 3)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logger.addHandler(handler)

這樣,uvicorn 的輸出,就會記錄在 api.log 中。

第三種,配置 uvicorn 的日志

如果你是這種方法運行 FastApi:

app = FastAPI()
uvicorn.run(app, host="0.0.0.0", port=8000)

那么可以在代碼里配置 uvicorn 的日志,然后在 run 函數里傳入日志配置信息,就可以了:

log_config = uvicorn.config.LOGGING_CONFIG
log_config["formatters"]["access"]["fmt"] = "%(asctime)s - %(levelname)s - %(message)s"
log_config["formatters"]["default"]["fmt"] = "%(asctime)s - %(levelname)s - %(message)s"
uvicorn.run(app, log_config=log_config)

當然,在命令行里面也可以通過 uvicorn --log-config=log.ymal 傳入配置文件:

version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
loggers:
simpleExample:
level: DEBUG
handlers: [console]
propagate: no
root:
level: DEBUG
handlers: [console]

日志文件支持 .ini, .json, .yaml 格式。

最后的話

本文分享了 FastAPI 配置日志的三種方法,后兩種其實是 uvicorn 配置并記錄日志的方法。

責任編輯:武曉燕 來源: Python七號
相關推薦

2022-05-30 07:07:35

Java監聽文件Java 8

2009-07-08 12:56:32

編寫Servlet

2010-09-14 15:10:49

CSS注釋

2009-12-11 18:49:39

預算編制博科資訊

2022-07-13 16:06:16

Python參數代碼

2011-04-18 15:32:45

游戲測試測試方法軟件測試

2024-11-15 07:00:00

Python發送郵件

2023-08-14 17:58:13

RequestHTTP請求

2011-06-10 10:43:12

Ubuntu應用安裝

2009-06-23 10:45:18

Hibernate支持

2011-08-31 13:55:38

PDF去水印

2021-09-10 18:09:42

SQL注入漏洞網絡攻擊

2023-05-16 16:07:07

大數據數據管理工具

2021-07-13 12:31:27

IT組織改進首席技術官

2021-12-20 07:11:26

Java List排序 Java 基礎

2021-10-09 06:59:36

技術MyBatis數據

2010-10-20 13:52:07

SQL Server數

2009-07-23 15:17:54

JDBC連接Acces

2016-09-09 13:07:56

CentOSJDKLinux

2023-09-25 15:08:43

Python方離群值
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人综合一区二区 | 在线播放国产一区二区三区 | 成年视频在线观看福利资源 | 91精品国产一区二区三区 | 亚洲高清视频一区 | 亚洲精品在 | 国产成人99 | 国产精品久久久久久久久久久久久久 | 国产亚洲精品综合一区 | 天天射网站 | 亚洲激情在线观看 | 精品欧美一区二区三区 | 激情91| 亚洲精品久久久9婷婷中文字幕 | 99re热精品视频国产免费 | 久久久精品网 | 免费在线视频一区二区 | 中文字幕电影在线观看 | 中文字幕视频在线免费 | a级在线观看 | 亚洲三区在线观看 | 久久草视频| 手机日韩 | a级片在线观看 | 亚洲一二三在线观看 | 黄色欧美在线 | 国产精品久久久久久久久久了 | 国产精品99久久久久久www | 午夜激情免费视频 | 97视频在线观看网站 | 美女一级黄 | 九色视频网站 | 亚洲一区二区久久 | 在线观看视频亚洲 | 一区二区三区欧美 | 无毛av | 美女二区 | 91精品国产综合久久久久蜜臀 | 久久久91精品国产一区二区三区 | xxxxx免费视频 | dy天堂 |