引言 本文将对上一篇《1.【最简】Flask日志记录》进行一些优化改进,如下所示: 优化点
- 【封装】日志功能单独封装成“工具类/函数”。
- 【本地保存】日志信息进行“本地文件保存”。
- 【(简易版)链路跟踪】“蓝图”结合uuid进行API请求/响应的“唯一定义”。
1.代码实现
1.【封装】日志工具(函数)
1.【实现】日志工具
# -*- coding: utf-8 -*-
"""
====================================
@File Name :logUtils.py
@Time : 2022/4/30 22:50
@Program IDE :PyCharm
@Create by Author : 一一Cooling
====================================
"""
import logging
from logging.handlers import TimedRotatingFileHandler
# logUtils()函数:【参数:app--->we为Flask的实例化对象】
def logUtils(app):
logFilePtah = "./resource/flask.log"
formatter = logging.Formatter(f"[[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s][%(thread)d]] - %(message)s")
handler = TimedRotatingFileHandler(logFilePtah, when="D", interval=1, backupCount=15, encoding="UTF-8", delay=False,
utc=True)
app.logger.addHandler(handler)
handler.setFormatter(formatter)
2.【集成关联】Flask实例化对象
#!/usr/bin/env pytho
# -*- coding: utf-8 -*-
"""
@author:cooling
@file:main.py
@time:2022/04/16
"""
import resource.flaskConfig as config1
from flask import Flask,make_response
from flask_cors import CORS
from api.login import loginApp # 【step4】【导入】蓝图-模块文件
from api.cookie import cookieApp
from api.session import sessionApp
from api.flaskSQL import sqlApp
from api.webhook import webhookApp
#【核心代码】 【导入】日志工具-函数
from utils.logUtils import logUtils
#【核心代码】 【导入】uuid工具-函数
from utils.uuidUtils import traceID
traceID=traceID() # 调用traceID() ,生成traceID数据
app = Flask(__name__)
CORS(app) # 解决跨域
app.secret_key = "test2022"
app.debug = True
# 处理中文乱码
# app.config['JSON_AS_ASCII'] = False
app.config.from_object(config1)
# 【step5】 注册:蓝图对象
# loginApp.register_blueprint(cookieApp) # 将cookieApp嵌套绑定到loginApp上
app.register_blueprint(loginApp)
app.register_blueprint(cookieApp)
app.register_blueprint(sessionApp)
app.register_blueprint(sqlApp)
app.register_blueprint(webhookApp)
# 【核心代码】【使用/绑定】日志工具函数
logUtils(app)
@app.get("/")
def index():
response=make_response("这是主页")
response.headers['traceID']=traceID
app.logger.info(f"[traceID={traceID}]\t主页...]")
return response
# if __name__ == '__main__':
# app.run(port=8806,host="0.0.0.0",debug=True)
2.【封装】uuid工具(函数)
# -*- coding: utf-8 -*-
"""
====================================
@File Name :uuidUtils.py
@Time : 2022/5/1 10:23
@Program IDE :PyCharm
@Create by Author : 一一Cooling
====================================
"""
from uuid import uuid4
def traceID():
traceID = str(uuid4()).replace("-", "")
# print("当前的traceID:\t",traceID)
return traceID
# if __name__ == '__main__':
# traceID()
3.【整合】蓝图视图模块
【(简易版)链路跟踪】“蓝图”结合uuid进行API请求/响应的“唯一定义”。
#!/usr/bin/env pytho
# -*- coding: utf-8 -*-
"""
@author:cooling
@file:login.py
@time:2022/04/16
"""
# 【step1】导入 蓝图[Blueprint]
from flask import Blueprint as bp
from flask import make_response
from flask import current_app # 【核心代码】使用Flask中的current_app
# 【核心代码】 【导入】uuid工具-函数
from utils.uuidUtils import traceID
traceID = traceID() # 调用traceID() ,生成traceID数据
# 【step2】 声明-蓝图-->参数:定义蓝图的名字;导入__name__
loginApp = bp("loginApp", __name__, url_prefix="/login")
# 【step3】定义:蓝图视图函数
@loginApp.get("/index")
def login():
# 【核心代码】定义:error日志
current_app.logger.info(f"[traceID={traceID}]\tlogin(主)页面...]")
response = make_response("这是login(主)页面")
# 【核心代码】将“traceID”设置到“repsonse的headers”中
response.headers['traceID'] = traceID
return response
2.测试验证
下面使用apifox对“/login/index”进行验证:
检查点
- “日志文件”有数据写入?
- “日志文件”中的traceID与“response-headers的traceID”一致?
3.总结
缺点 日志信息没有做“数据持久化保存”
优化方案整合ELK或者skywalking