精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

FastAPI 實戰秘籍:從零構建高性能 API-日志篇

開發
?日志(Logging)在軟件開發和系統運維中扮演著至關重要的角色,它記錄了系統運行時的各種事件、狀態和錯誤信息。

接上文《FastAPI 實戰秘籍:從零構建高性能 API -配置篇

日志(Logging)在軟件開發和系統運維中扮演著至關重要的角色,它記錄了系統運行時的各種事件、狀態和錯誤信息。

作用:

  • 問題排查與調試
  • 監控系統健康狀態
  • 安全審計與合規
  • 性能分析與優化
  • 用戶行為分析
  • 數據恢復與回溯

日志級別和應用場景:

  • DEBUG 開發調試細節(變量值、流程分支)
  • INFO 常規運行狀態(服務啟動、關鍵業務事件)
  • WARN 非預期但可恢復的問題(低磁盤空間、降級操作)
  • ERROR 需要干預的錯誤(外部API失敗、數據庫連接中斷)
  • FATAL 導致服務崩潰的嚴重錯誤(無法恢復的異常)

在我們web開發過程中一般通過app.log記錄全部日志,通過error.log記錄ERROR級別以上的日志,能夠快速定位、排查問題。

APP日志

在通過fastapi日志模塊中,我們使用標準模塊logging。通過配置文件配置日志文件,等級、文件大小輪轉、備份日志文件數目等。

# config/config.yml

logging:
level:"INFO"
log_path:"logs/app.log"
error_path:"logs/error.log"
rotate_size:10# 日志文件輪轉大小 單位M
back_files:5# 多保留n個備份

在配置解析腳本中config.py:

# config/config.py

class LoggingConfig(BaseModel):
    level: str = "INFO"
    log_path: str = "logs/app.log"
    error_path: str = "logs/error.log"
    rotate_size: int = 10
    back_files: int = 5

修改主配置模型:

# config/config.py

# 主配置模型中嵌套Logging
class Settings(BaseSettings):
    ...
    logging: LoggingConfig

在core目錄下創建logger.py模塊,定義日志句柄,格式,處理方式等。

import logging
import os
import queue
from enum import Enum
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler, QueueHandler, QueueListener
from typing import Dict, Callable, Optional

from config.config import BASE_DIR, get_settings

# 初始化配置
settings = get_settings()
logger = logging.getLogger(settings.app.name)

# 常量定義
LOG_FORMAT = "%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s - %(message)s"
LOG_ACCESS_FILE = os.path.join(BASE_DIR, settings.logging.log_path)
LOG_PATH = os.path.dirname(LOG_ACCESS_FILE)
HANDLER_TYPE = "rotate_file"

# 確保日志目錄存在
os.makedirs(LOG_PATH, exist_ok=True)


class LoggerLevel(Enum):
    """日志級別枚舉類"""
    DEBUG = ("DEBUG", logging.DEBUG)
    INFO = ("INFO", logging.INFO)
    WARNING = ("WARNING", logging.WARNING)
    ERROR = ("ERROR", logging.ERROR)
    CRITICAL = ("CRITICAL", logging.CRITICAL)

    @property
    def level(self) -> int:
        """獲取日志級別數值"""
        return self.value[1]

    @classmethod
    def get_by_config(cls, level_str: str) -> Optional['LoggerLevel']:
        """根據配置字符串獲取日志級別枚舉"""
        return next((log for log in cls if log.value[0] == level_str), None)


class LoggerFactory:
    """日志工廠類,集中管理日志處理器創建"""

    HANDLERS: Dict[str, Callable] = {
        "default": "_create_default_handler",
        "queue": "_create_queue_handler",
        "rotate_file": "_create_rotate_file_handler",
        "timed_rotate_file": "_create_timed_rotate_file_handler"
    }

    @classmethod
    def get_logger(cls) -> logging.Logger:
        """根據配置獲取適當的日志處理器"""
        handler_method = getattr(cls, cls.HANDLERS.get(HANDLER_TYPE, "_create_default_handler"))
        handler = handler_method()
        return cls._setup_logger(handler)

    @classmethod
    def _setup_logger(cls, handler: logging.Handler) -> logging.Logger:
        """配置日志記錄器"""
        # 清除現有處理器
        for h in logger.handlers[:]:
            logger.removeHandler(h)
            h.close()

        # 設置日志級別
        logger_level = LoggerLevel.get_by_config(settings.logging.level)
        logger.setLevel(logger_level.level if logger_level else logging.DEBUG)

        # 添加處理器
        handler.setFormatter(logging.Formatter(LOG_FORMAT))
        logger.addHandler(handler)
        return logger

    @classmethod
    def _create_default_handler(cls) -> logging.FileHandler:
        """創建默認文件處理器"""
        print("使用默認文件日志處理器")
        return logging.FileHandler(LOG_ACCESS_FILE, delay=True, encoding="utf-8")

    @classmethod
    def _create_queue_handler(cls) -> QueueHandler:
        """創建隊列日志處理器"""
        print("使用異步隊列日志處理器")
        log_queue = queue.Queue(-1)  # 無限大小隊列
        file_handler = logging.FileHandler(LOG_ACCESS_FILE, delay=True, encoding="utf-8")

        # 創建并啟動隊列監聽器
        listener = QueueListener(
            log_queue,
            file_handler,
            respect_handler_level=True
        )
        listener.start()

        return QueueHandler(log_queue)

    @classmethod
    def _create_rotate_file_handler(cls) -> RotatingFileHandler:
        """創建按文件大小輪轉的處理器"""
        print("使用文件大小輪轉日志處理器")
        return RotatingFileHandler(
            LOG_ACCESS_FILE,
            maxBytes=settings.logging.rotate_size * 1024 * 1024,
            backupCount=settings.logging.back_files,
            encoding="utf-8"
        )

    @classmethod
    def _create_timed_rotate_file_handler(cls) -> TimedRotatingFileHandler:
        """創建按時間輪轉的處理器"""
        print("使用時間輪轉日志處理器")
        return TimedRotatingFileHandler(
            LOG_ACCESS_FILE,
            when='midnight',
            interval=1,
            backupCount=settings.logging.back_files,
            encoding="utf-8"
        )


def get_logger() -> logging.Logger:
    """獲取配置好的日志記錄器"""
    return LoggerFactory.get_logger()

上面腳本中HANDLER_TYPE沒設置在配置文件中,僅開發人員能夠修改。 logging中 大概有四種處理器:

  • FileHandler 阻塞寫入日志文件
  • QueueHandler 非阻塞隊列寫入日志
  • RotatingFileHandler 文件大小輪轉
  • TimedRotatingFileHandler 時間間隔輪轉

在__init__.py定義暴露方法:

from core.logger import get_logger
__all__ = [get_logger]

測試日志:

# main.py

def create_app():
    """啟動項目"""

    ...

    @app.get("/{form_id}")
    async def root(form_id: int = Path(..., gt=0)):
        get_logger().info(" ===aaa===")
        return {"message": form_id}

    return app

啟動服務,我們可以看到輸出的日志內容。

效果如下:

ERROR日志

為了更好的處理線上問題,排查問題。除了項目日志app.log外,系統異常報錯的日志記錄到error.log中。

Fastapi中可以通過裝飾器@app.exception_handler(Exception)記錄全局異常。

文檔地址:https://fastapi.tiangolo.com/zh/tutorial/handling-errors/#_4

在core包中,我們創建模塊exception.py。 在其中通過依賴注入的方式設置全局異常。

# core/exception.py

...
def register_exception(app: FastAPI):
    """
    異常捕捉
    """

    @app.exception_handler(CustomException)
    asyncdef custom_exception_handler(request: Request, exc: CustomException):
        """
        自定義異常
        """
        _logger.error(
            f"Path: {request.url.path}\n"
            f"Method: {request.method}\n"
            f"Client: {request.client.host if request.client else 'unknown'}\n"
            f"Exception: {type(exc).__name__}",
            exc_info=(type(exc), exc, exc.__traceback__)
        )

        return JSONResponse(
            status_code=exc.status_code,
            cnotallow={"message": exc.msg, "code": exc.code},
        )

    @app.exception_handler(HTTPException)
    asyncdef unicorn_exception_handler(request: Request, exc: HTTPException):
        """
        重寫HTTPException異常處理器
        """
        _logger.error(
            f"Path: {request.url.path}\n"
            f"Method: {request.method}\n"
            f"Client: {request.client.host if request.client else 'unknown'}\n"
            f"Exception: {type(exc).__name__}",
            exc_info=(type(exc), exc, exc.__traceback__)
        )
        return JSONResponse(
            status_code=exc.status_code,
            cnotallow={
                "code": exc.status_code,
                "message": exc.detail,
            }
        )
      ...

代碼倉庫 https://github.com/pyzxs/zadmin。

在__init__.py中設置暴露函數:

from core.exception import register_exception
from core.logger import get_logger

__all__ = [get_logger,register_exception]

在main.py的啟動腳本中設置:

# main.py

from core import get_logger, register_exception

def create_app():
    ...
    register_exception(app)
    ...

測試異常處理:

@app.get("/{form_id}")
    async def root(form_id: int = Path(..., gt=0)):
        # raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
        # raise CustomException("CustomException")
        # raise ValueError("ValueError")
        
        return {"message": form_id}

    return app

運行測試, 該路由地址中定義{form_id:int}是整形,如果輸入字符串就會拋出RequestValidationError,在error.log中會記錄異常的追溯。

效果如下:

現在項目的日志模塊就定義好了。你可以在調試的代碼中通過get_logger().debug()后info()調試代碼了。同時系統exception報錯也會記錄到error.log中。幫助你盡快定位異常。

責任編輯:趙寧寧 來源: 程序員老朱
相關推薦

2025-09-08 06:10:00

FastAPI開發web

2025-09-09 07:00:00

數據庫FastAPI開發

2025-06-03 08:15:00

微服務架構異步任務隊列

2017-07-11 15:26:57

LocalMQ RocketMQ高性能

2023-11-06 08:32:17

FastAPIPython

2021-10-14 09:51:17

架構運維技術

2018-05-08 18:26:49

數據庫MySQL性能

2025-05-26 09:25:00

Web 接口開發Redis

2019-09-03 09:41:48

運維架構技術

2025-04-07 05:00:00

2025-01-13 12:23:51

2024-11-25 09:10:03

2011-10-21 14:20:59

高性能計算HPC虛擬化

2011-10-25 13:13:35

HPC高性能計算Platform

2022-12-09 08:40:56

高性能內存隊列

2023-08-23 10:16:47

日志系統

2011-04-18 10:16:30

WEB高性能

2017-08-16 11:00:38

TCPIP協議

2018-03-30 18:17:10

MySQLLinux

2025-09-10 07:36:05

點贊
收藏

51CTO技術棧公眾號

91麻豆精品国产91久久久平台 | 欧洲美女和动交zoz0z| 九九热最新视频| 婷婷综合久久| 日韩av在线一区二区| 丁香婷婷激情网| 中文字幕在线播放网址| av亚洲产国偷v产偷v自拍| 国产aⅴ夜夜欢一区二区三区| 国产在线免费av| 51vv免费精品视频一区二区| 一本一道久久a久久精品| 在线视频不卡国产| 五月婷婷六月丁香| 肉色丝袜一区二区| 色综合天天狠天天透天天伊人| 极品粉嫩小仙女高潮喷水久久 | 在线黄色网页| 久久婷婷国产综合精品青草 | 国产夫妻自拍av| 视频在线观看91| 欧美激情第6页| 91n在线视频| 国产精品自拍区| 精品国产1区2区3区| 亚洲综合欧美激情| 亚洲精品动漫| 亚洲成人免费视频| 50度灰在线观看| 91精品大全| 91老师片黄在线观看| 国产不卡一区二区三区在线观看| 这里只有精品999| 久久精品官网| 欧美在线免费视频| 日韩精品一区二区在线播放 | 91淫黄看大片| 625成人欧美午夜电影| 亚洲va在线va天堂| 日韩在线观看a| 国产理论在线观看| 日韩一区在线播放| 亚洲欧美日韩另类精品一区二区三区 | 色是在线视频| 午夜精品成人在线| 无码中文字幕色专区| 三级福利片在线观看| 亚洲美女视频在线| 国产大尺度在线观看| 黄色视屏免费在线观看| 亚洲欧洲精品一区二区精品久久久| 日本午夜精品一区二区| 黄视频在线观看免费| 久久久99免费| 手机在线观看国产精品| 国产在线视频资源| 国产精品情趣视频| 亚洲一区二区三区免费看| 色大18成网站www在线观看| 国产精品午夜春色av| 亚洲日本无吗高清不卡| 日本最新在线视频| 亚洲乱码国产乱码精品精可以看| 国产欧美自拍视频| 香蕉成人app免费看片| 亚洲一区二区三区自拍| 毛片在线播放视频| 三上悠亚激情av一区二区三区| 91国产免费看| 亚洲 欧美 另类人妖| 91成人福利社区| 精品奇米国产一区二区三区| 色婷婷精品久久二区二区密| 亚洲电影男人天堂| 欲色天天网综合久久| 国产wwwwxxxx| 欧美三区美女| 26uuu另类亚洲欧美日本一| 久久精品无码av| 美女视频黄久久| 99精彩视频在线观看免费| 秋霞网一区二区| 国产色综合一区| 国产精品无码乱伦| 九色porny丨首页入口在线| 色综合久久久久综合体| 午夜久久福利视频| 欧美成人基地| www.美女亚洲精品| 日本三级中文字幕| 日本亚洲免费观看| 产国精品偷在线| 国产综合视频一区二区三区免费| 成人免费一区二区三区在线观看| 老子影院午夜伦不卡大全| 日韩电影网站| 亚洲精品一区二区三区影院| av黄色免费网站| 欧美一区91| 国产91久久婷婷一区二区| 91在线你懂的| 久久综合九色综合欧美就去吻| 亚洲欧美久久234| 草草视频在线| 欧美一区二区福利视频| av黄色在线免费观看| 红桃视频国产一区| 国产欧美亚洲精品| 欧美亚洲日本| 亚洲国产综合在线| 亚洲精品手机在线观看| 九九热爱视频精品视频| 九九热视频这里只有精品| 中文字幕1区2区3区| 北条麻妃一区二区三区| 三级网在线观看| 亚洲播播91| 亚洲丁香久久久| 国模无码国产精品视频| 久久成人av少妇免费| 乱一区二区三区在线播放| 午夜成年人在线免费视频| 欧美午夜片在线看| 国产黄色网址在线观看| 亚洲视频一区| 2014亚洲精品| 国产盗摄在线观看| 欧美日韩一级视频| 午夜在线观看一区| 久久亚洲视频| 久久99精品久久久久久久久久| 亚洲丝袜一区| 日韩午夜激情视频| 国产极品国产极品| 韩国v欧美v亚洲v日本v| 亚洲精品一区二区三| 色婷婷综合久久久中字幕精品久久 | 国产盗摄xxxx视频xxx69| 香蕉视频黄色片| 偷窥国产亚洲免费视频| 丰满人妻一区二区三区免费视频棣 | 亚洲欧美激情另类校园| 91美女免费看| 91丨porny丨最新| 国产xxxxx在线观看| 神马午夜久久| 奇米影视亚洲狠狠色| 亚州男人的天堂| 色综合天天性综合| 国产色视频一区二区三区qq号| 国产免费成人| 欧美一区二区三区电影在线观看| 免费观看欧美大片| 亚洲欧洲偷拍精品| 成人黄色免费网| 中文字幕一区三区| 免费观看黄网站| 亚洲成人中文| 精品一区二区久久久久久久网站| 中文在线最新版地址| 亚洲日本aⅴ片在线观看香蕉| 国产精品无码一区| 亚洲欧洲日韩av| 稀缺呦国内精品呦| 亚洲综合电影一区二区三区| 欧美精品在线一区| 国产a亚洲精品| 久久国产精品久久久久久久久久 | 男人的天堂视频在线| а√中文在线天堂精品| 欧美性受xxx| av福利精品| 日韩免费电影网站| 成年人视频在线免费看| 欧美激情中文字幕一区二区| 小早川怜子一区二区三区| 欧美日韩国产免费观看| 精品1区2区| 成人h在线观看| 欧美刺激性大交免费视频| 香蕉av一区二区三区| 欧美日韩亚洲国产综合| 国产一级淫片免费| 久久精品欧美日韩精品| 国产xxxxhd| 免费视频久久| 欧美性受xxxx黑人猛交88| 国内毛片久久| 国产日韩在线亚洲字幕中文| 蜜臀av在线| 中文字幕视频在线免费欧美日韩综合在线看 | 深夜成人在线| 久久亚洲精品一区| 偷拍精品一区二区三区| 欧美精品视频www在线观看| 日本五十路女优| 国产精品视频一二三区| 国产a级片视频| 免费xxxx性欧美18vr| 免费高清一区二区三区| 爽成人777777婷婷| 久久久久无码国产精品一区| 精品国产三级| 国产成人精品免费久久久久 | 66国产精品| 欧美国产视频在线观看| 最新国产一区二区| 国产免费一区二区三区在线观看 | 国产精品露脸自拍| 888av在线视频| 亚洲天堂第一页| 全部免费毛片在线播放一个| 91麻豆精品国产无毒不卡在线观看| 青青草偷拍视频| 国产欧美一区二区三区在线看蜜臀 | 国产精品亚洲一区二区在线观看| 日本一欧美一欧美一亚洲视频| 在线你懂的视频| www国产亚洲精品久久网站| 噜噜噜噜噜在线视频| 亚洲аv电影天堂网| 国产丝袜在线视频| 欧美日韩国产成人在线免费| 国产一区二区视频网站| 婷婷开心激情综合| 国产一级在线播放| 亚洲制服丝袜av| 精品99久久久久成人网站免费| 国产精品毛片大码女人| 国精产品一区二区三区| 成人黄色国产精品网站大全在线免费观看| 国产又黄又猛又粗又爽的视频| 午夜在线观看免费一区| 国产一区二区在线视频播放| 亚洲小说区图片区| 国产精品www在线观看| 午夜精品偷拍| 成人在线播放网址| 狠狠综合久久av一区二区老牛| 日本一二三区视频在线| 欧美日韩日本国产亚洲在线| 91精品一区二区三区四区| 综合天堂av久久久久久久| 久久av秘一区二区三区| 图片小说视频色综合| 天堂v在线视频| 一区二区三区四区日韩| 免费成人深夜夜行网站视频| 久久精品亚洲人成影院| 熟女视频一区二区三区| 欧美成人嫩草网站| 粉嫩av一区二区三区天美传媒 | 国产精品免费观看久久| 国产精品入口66mio| 国产精品无码专区av在线播放| 丝袜美腿亚洲一区| 少妇一级淫免费放| 精品一区二区日韩| www日本在线观看| 99久久精品国产毛片| 国产精品一级黄片| 国产日韩精品久久久| 国产视频不卡在线| 亚洲男人都懂的| 日本系列第一页| 在线免费一区三区| 一起草av在线| 精品成人免费观看| 全色精品综合影院| 最近2019年手机中文字幕| 国产原创在线观看| 久久久久久中文字幕| 国产精欧美一区二区三区蓝颜男同| 日本欧美爱爱爱| 91麻豆精品| 国产一区国产精品| 成人aaaa| 免费人成在线观看视频播放| 日日摸夜夜添夜夜添精品视频 | 国产精品乱战久久久| 蜜桃av噜噜一区二区三| 四虎国产精品免费观看| 99er在线视频| 丝袜美腿一区二区三区| www,av在线| 26uuu另类欧美亚洲曰本| 日本在线观看网址| 亚洲国产精品嫩草影院| 樱花视频在线免费观看| 欧美mv和日韩mv的网站| 国产无套粉嫩白浆在线2022年| 久久亚洲春色中文字幕| 电影天堂国产精品| www.成人av.com| 欧美日韩色图| 蜜臀av无码一区二区三区| 免费观看成人av| 男人的天堂影院| 国产精品二三区| 亚洲天堂一区在线观看| 欧美一区二区啪啪| 欧美男男同志| 久久久久久久久网站| 91另类视频| 久精品国产欧美| 亚洲先锋影音| 亚洲少妇久久久| www国产亚洲精品久久麻豆| 波多野结衣亚洲一区二区| 欧美性受xxxx| 日韩成人黄色| 97久久久久久| 在线精品自拍| 国产精品h视频| 久久精品国产99久久6| 黑人巨大精品欧美| 亚洲成人免费视| 亚洲不卡免费视频| 精品国产一区久久久| www.26天天久久天堂| 久久艳妇乳肉豪妇荡乳av| 亚洲高清电影| 精品伦一区二区三区| 亚洲乱码国产乱码精品精可以看| 中文字幕免费播放| 亚洲偷欧美偷国内偷| 中国色在线日|韩| 国产欧美日韩一区二区三区| 欧美有码视频| 深夜做爰性大片蜜桃| 中文字幕日韩一区二区| 亚洲精品一区二区二区| 在线观看欧美www| 成人精品国产亚洲| 日韩欧美精品一区二区三区经典| 西西裸体人体做爰大胆久久久| 少妇被狂c下部羞羞漫画| 亚洲伊人伊色伊影伊综合网| www.97av.com| 色综合久久久久久中文网| 麻豆精品在线| 996这里只有精品| 高清国产一区二区| 日本午夜小视频| 亚洲精品一区二区三区不| 香蕉伊大人中文在线观看| 日本一区二区三区在线视频| 裸体素人女欧美日韩| www.狠狠爱| 欧美三区免费完整视频在线观看| av基地在线| 91亚洲精品久久久| 欧美1区3d| 岛国精品一区二区三区| 亚洲成av人片在www色猫咪| 亚洲欧美自偷自拍| 国产999精品| 视频在线不卡免费观看| 中国男女全黄大片| 五月综合激情网| 国产最新视频在线| 成人免费视频网| 激情久久久久| 丰满少妇高潮一区二区| 精品视频免费看| 在线观看操人| 另类视频在线观看+1080p| 日韩制服丝袜av| 91高清免费观看| 亚洲精品电影在线观看| 欧美日韩视频免费观看| 中文字幕精品一区日韩| 成人小视频免费在线观看| 亚洲欧美精品一区二区三区| 少妇av一区二区三区| 91麻豆精品激情在线观看最新| 日本日本19xxxⅹhd乱影响| 国产欧美一区二区三区鸳鸯浴| 亚洲男人第一网站| 日韩资源在线| 国产精品日韩精品| 欧美精品97| 9.1成人看片免费版| 欧美久久一二三四区| 91av久久| 亚洲一区二区三区免费看| 成人精品亚洲人成在线| 人人妻人人爽人人澡人人精品 | 美女久久一区| 疯狂撞击丝袜人妻| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 黄色片视频在线免费观看| 国产精品国产a级| 免费国产精品视频| 国产精品视频yy9099| 精品电影一区| 天堂网中文在线观看| 日韩精品在线观| 亚洲无线观看| 91香蕉视频污版|