1. 程式人生 > 其它 >flask為每次請求新增一個id標記

flask為每次請求新增一個id標記

技術標籤:pythonflaskflasklogging

場景

  • api日誌在列印的過程中,並不是一個請求的日誌集中在一起
  • 大批量請求的時候,日誌列印的很混亂,想要找到單個api請求的日誌(很難)

需求

  • 每次請求之前設定當前api有個特殊的ID,請求另外一個api也生成一個id,並且兩個api的id獨立,互不影響

方法庫

pip install flask_request_id

demo

# coding: utf-8
from flask import Flask

app = Flask(__name__)
from flask_request_id import RequestID

request =
RequestID(app) @app.route("/") def index(): print(request.id) return "1231231231" if __name__ == '__main__': app.run()

在這裡插入圖片描述

放到日誌中輸出

  • 建立logg.py檔案
import logging

from flask_request_id import RequestID
from flask import current_app

request = RequestID(current_app)

BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"

COLORS = {
    'WARNING': GREEN,
    'INFO': WHITE,
    'DEBUG': BLUE,
    'CRITICAL': YELLOW,
    'ERROR': RED
}


class ColoredFormatter(logging.Formatter):
    def __init__(self, msg, use_color=True):
        logging.Formatter.__init__(self, msg)
        self.use_color = use_color

    def format(self, record):
        levelname = record.levelname
        message = str(record.msg)
        funcName = record.funcName
        if self.use_color and levelname in COLORS:
            levelname_color = COLOR_SEQ % (30 + COLORS[levelname]) + levelname + RESET_SEQ
            message_color = COLOR_SEQ % (30 + COLORS[levelname]) + message + RESET_SEQ
            funcName_color = COLOR_SEQ % (30 + COLORS[levelname]) + funcName + RESET_SEQ
            record.levelname = levelname_color
            record.msg = message_color
            record.funcName = funcName_color
            record.request_id = request.id
        return logging.Formatter.format(self, record)


LOGFORMAT = "[%(request_id)s][%(asctime)s][%(name)s] [%(levelname)s] (%(filename)s:%(funcName)s:%(lineno)d) %(message)s"
LOG_LEVEL = logging.DEBUG
formatter = ColoredFormatter(LOGFORMAT)
stream = logging.StreamHandler()
stream.setLevel(LOG_LEVEL)
stream.setFormatter(formatter)
logging.root.setLevel(LOG_LEVEL)


def Logging(name):
    log = logging.getLogger(name)
    log.setLevel(LOG_LEVEL)
    log.addHandler(stream)
    return log


if __name__ == '__main__':
    logger = Logging(__name__)
    logger.info(123123)
    logger.debug(123123)
    logger.error(123123)
    logger.warning(123123)
  • 建立main.py
from flask import Flask

app = Flask(__name__)
app.app_context().push()  # 推送上下文之後,下方中間層才能使用current_app
from logg import Logging

logging = Logging(__name__)


@app.route("/")
def index():
    for i in range(1000):
        logging.info(123123)
    return "1231231231"


if __name__ == '__main__':
    app.run()