精品欧美一区二区三区在线观看 _久久久久国色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视频| 一区二区三区中文字幕精品精品| 亚洲综合日韩在线| 欧美成人一二三区| 欧美调教网站| 精品视频在线看| 欧美a级黄色大片| 天天干视频在线| 天堂av在线一区| 色噜噜国产精品视频一区二区| 久久综合久久色| www在线观看播放免费视频日本| 国产91精品一区二区麻豆亚洲| 欧美亚洲国产视频| av黄色免费在线观看| 国产精品白丝av嫩草影院| 色婷婷精品大在线视频 | www.国产在线播放| 经典三级在线| 国产福利精品导航| 欧美自拍大量在线观看| 国产91在线播放九色| 99久久人爽人人添人人澡| 在线日韩av片| 国产 日韩 欧美在线| 免费在线看v| 国产九九视频一区二区三区| 青青草一区二区| 亚洲色婷婷一区二区三区| 国产精品x8x8一区二区| 欧美人牲a欧美精品| 你懂的av在线| caopon在线免费视频| 久久精子c满五个校花| 丁香五月网久久综合| 中文字幕在线一| 欧美+日本+国产+在线a∨观看| 欧美xxxxx牲另类人与| www.se五月| av一区在线播放| 91福利社在线观看| 国产成人a亚洲精v品无码| 国产网站在线| 亚洲国产va精品久久久不卡综合| 久久最新免费视频| 18加网站在线| 亚洲卡通动漫在线| 久久亚洲a v| 欧美1—12sexvideos| 尤物在线观看一区| 成人一级生活片| 不卡视频观看| 色综合天天综合网天天狠天天| 久久国产亚洲精品无码| 中文字幕高清在线播放| 色婷婷久久久亚洲一区二区三区| www.日日操| 成人亚洲免费| 91麻豆精品国产自产在线| 交换做爰国语对白| av男人一区| 日韩高清有码在线| 中文字幕在线观看网址| 国产精品手机在线播放| 一个人www欧美| 亚洲女人毛茸茸高潮| 91精品国产视频| 欧美老少做受xxxx高潮| 久久亚洲av午夜福利精品一区| 亚洲美女毛片| 日韩免费在线播放| 国产一区二区三区四区视频 | 91精品视频在线| www.天堂在线| 91免费版在线| 一本一本久久a久久精品综合妖精| 国产精品剧情一区二区在线观看| 亚洲在线免费播放| 热久久精品国产| 在线免费成人| 亚洲国产精品成人精品| 懂色av粉嫩av浪潮av| 在线中文一区| 日本精品久久久久影院| 国产女人18毛片水真多| av网站一区二区三区| 亚欧精品在线| 都市激情久久综合| 欧美性生活影院| 亚洲成年人在线观看| 第一sis亚洲原创| 国模私拍视频一区| 一区二区久久精品66国产精品| 国产91精品一区二区| 日韩影片在线播放| 少女频道在线观看高清| 在线观看日韩毛片| 美女搡bbb又爽又猛又黄www| 精品视频网站| 久久免费视频网| 91精品国自产| www精品美女久久久tv| 欧美少妇一级片| 日韩三级影视| 亚洲成人性视频| 夫妻性生活毛片| 久久婷婷麻豆| 狠狠久久综合婷婷不卡| 黄色网页在线免费看| 一本大道久久a久久综合婷婷| 激情成人在线观看| 欧州一区二区| 欧美又大又硬又粗bbbbb| 国产孕妇孕交大片孕| 久久婷婷色综合| 国产精品一线二线三线| 国产精品一级在线观看| 在线免费看av不卡| 手机看片久久久| av激情综合网| 成人午夜精品久久久久久久蜜臀| 精品国产亚洲一区二区三区大结局| 亚洲美女性生活视频| 日本三级免费看| 国产福利91精品一区| 中文字幕日韩一区二区三区| 色猫猫成人app| 亚洲人成在线观看网站高清| 一级片中文字幕| 成人网在线播放| 欧美 亚洲 视频| 国产精品亚洲四区在线观看 | 麻豆mv在线观看| 精品日韩欧美一区二区| 久热精品在线观看| 成人妖精视频yjsp地址| www.国产二区| 视频精品一区二区三区| 欧美黄网免费在线观看| а√天堂资源在线| 一级日本不卡的影视| 久久久久99人妻一区二区三区| 欧美国内亚洲| 古典武侠综合av第一页| av最新在线| 亚洲男人7777| 糖心vlog精品一区二区| 亚洲国产精品高清| 中文字幕永久有效| 一区二区三区午夜视频| 91牛牛免费视频| 尤物yw193can在线观看| 欧美mv和日韩mv的网站| 国产无遮挡又黄又爽在线观看| 国产成人精品免费在线| av免费观看国产| 一道本一区二区三区| 国产成人aa精品一区在线播放| 免费国产在线观看| 欧美日韩黄色影视| 欧美国产日韩在线观看成人| 国产成人免费xxxxxxxx| 欧美 日本 亚洲| 精品国产精品| 亚洲在线视频观看| а√天堂资源官网在线资源| 一色桃子一区二区| 国产美女主播在线观看| 亚洲午夜免费视频| 粉嫩av蜜桃av蜜臀av| 久久99久久99精品免视看婷婷 | 亚洲免费影视| 午夜精品视频在线观看一区二区| 中文幕av一区二区三区佐山爱| 欧美肥婆姓交大片| 日本私人网站在线观看| 欧美日韩日日骚| 久久伊人成人网| 国产偷国产偷精品高清尤物| 五月六月丁香婷婷| 国产精品亚洲综合色区韩国| 亚洲mv在线看| av综合网站| 国产精品盗摄久久久| 在线看一级片| 亚洲视频在线看| 国产wwwxxx| 日本电影亚洲天堂一区| 欧美成人精品欧美一级私黄| 久久久久国产精品人| 爱情岛论坛亚洲自拍| 蜜桃伊人久久| www.亚洲成人网| 欧美一区二区三| 国产精品视频一区二区三区经| 成人在线爆射| 欧美精品18videosex性欧美| aaa在线免费观看| 亚洲国产成人精品女人久久久| 在线观看av大片| 精品久久久一区二区| 加勒比婷婷色综合久久| 久久久久久久久久美女| 蜜桃色一区二区三区| 日本欧美一区二区| 日本韩国欧美在线观看| 欧美影院一区| 亚洲高清在线播放| 国产精品入口久久| 久久精品国产一区二区三区不卡| 日本一区二区三区视频在线看| 国产精品免费久久久| 男人最爱成人网| 97免费视频在线| 亚洲精品天堂| 久色乳综合思思在线视频| 成年人在线视频免费观看| 亚洲黄色www网站| www.国产欧美| 日韩一区二区在线观看视频| 中文字幕 亚洲视频| 色成年激情久久综合| 国产成人在线免费视频| 五月婷婷色综合| 日韩精品视频播放| 亚洲国产成人高清精品| 欧美成人一区二区三区高清| 亚洲女人****多毛耸耸8| 999精品视频在线观看播放| 国产精品五月天| 欧美人妻一区二区三区| 国产视频一区在线播放| www.av欧美| 久久久青草青青国产亚洲免观| 国模私拍在线观看| 91一区二区在线| jizz日本免费| 26uuuu精品一区二区| 免费在线观看污| 日本一区二区视频在线| 亚洲四色影视在线观看| 一本色道久久综合精品婷婷| 欧美日韩一区高清| 亚洲天堂2021av| 欧美精品色综合| 精品国产一级片| 精品剧情在线观看| 婷婷色在线观看| 精品亚洲一区二区三区四区五区| 国产精品国产高清国产| 国产丝袜一区二区三区| 国产青青草在线| 日韩在线不卡视频| av免费在线免费| 久久久久久久成人| 忘忧草在线影院两性视频| 日韩av男人的天堂| 日韩免费大片| 丁香五月网久久综合| 日韩理论电影中文字幕| 色噜噜一区二区| 91av精品| 免费在线观看亚洲视频| 免费在线看一区| 国产又粗又猛又爽又黄| av福利精品导航| 人成免费在线视频| 一区二区免费在线播放| 成年人免费看毛片| 欧美视频精品在线| www.四虎在线观看| 亚洲欧洲自拍偷拍| 国产盗摄在线观看| 国产91|九色| 国产精品欧美一区二区三区不卡 | 亚洲日韩欧美一区二区在线| 免费在线观看黄视频| 色噜噜狠狠色综合中国| 国产精品乱码久久久| 亚洲国产精品推荐| av电影在线网| 91精品国产色综合久久不卡98口| 影音成人av| 国产精品亚洲不卡a| 欧美在线电影| 丰满少妇久久久| 九色porny丨国产精品| 久久福利小视频| 中文字幕一区二区三区色视频| 日韩成人免费在线观看| 欧美区视频在线观看| 天堂v在线观看| 久久精品视频中文字幕| 97se综合| 国产精品香蕉视屏| 亚洲激情五月| 国产aaaaa毛片| 91亚洲精华国产精华精华液| 中日韩一级黄色片| 色吊一区二区三区| 黄色av网址在线| 久久久国产精品视频| 成人午夜精品| 久久精品国产第一区二区三区最新章节 | 国产日韩欧美一区二区东京热| 国产视频丨精品|在线观看| 中文字幕有码在线观看| 国产乱肥老妇国产一区二| 欧美人与拘性视交免费看| 国产九色porny| 激情图片小说一区| 极品人妻videosss人妻| 欧美日韩激情视频8区| 亚洲国产成人在线观看| 久久精品国产视频| 秋霞国产精品| 欧美 日韩 国产 精品| 久久青草国产手机看片福利盒子 | 中文字幕日韩综合| 2014亚洲片线观看视频免费| 久久丫精品久久丫| 日韩欧美精品在线视频| 国产在线观看av| 成人a免费视频| 99久久精品费精品国产| 久久撸在线视频| 中文字幕欧美日韩一区| 国产精品乱码一区二区视频| 精品视频在线导航| 在线观看网站免费入口在线观看国内 | 日韩久久精品| 浓精h攵女乱爱av| 中文无字幕一区二区三区| 91porny九色| 亚洲一区二区精品| 日本在线精品| 日本一区免费观看| 三级欧美韩日大片在线看| 一区二区三区免费在线观看视频 | 国产又黄又大又粗视频| 99久久国产免费看| 天堂中文在线网| 亚洲男人的天堂在线| 精品亚洲美女网站| 亚洲一区二区精品在线观看| 免费人成黄页网站在线一区二区| 免费一级特黄3大片视频| 欧美日韩亚洲综合在线| 国产传媒在线播放| 粉嫩精品一区二区三区在线观看| 欧美午夜不卡| 喷水视频在线观看| 色婷婷精品久久二区二区蜜臂av| 国产youjizz在线| 国产日产亚洲精品| 欧美在线黄色| 亚洲调教欧美在线| 91成人免费电影| 欧美jizzhd69巨大| 成人在线资源网址| 麻豆九一精品爱看视频在线观看免费| 成人午夜福利一区二区| 欧美精三区欧美精三区| 青青草原av在线| 欧美日韩国产精品一区二区| 免费久久精品视频| 少妇影院在线观看| 亚洲精品国产精品国自产观看浪潮| 欧产日产国产精品视频| 亚洲高清视频一区二区| 懂色一区二区三区免费观看| 精品国产一区二区三区四| 日韩在线中文字幕| 加勒比色综合久久久久久久久| www.日日操| 一区二区三区不卡视频在线观看| 天天干,夜夜操| 国产欧美精品在线播放| 欧美福利网址| 在线不卡av电影| 日韩区在线观看| 欧美va视频| 国产日韩亚洲欧美在线| 久久精品欧美日韩| 亚洲美女性生活| 国产精品久久视频| 亚洲日本免费| 色欲一区二区三区精品a片| 日韩av网站大全| 日韩区欧美区| 麻豆三级在线观看| 欧美日韩国产丝袜美女| 成人日批视频|