引言 本文将对上一篇《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 loggingfrom 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 config1from flask import Flask,make_responsefrom flask_cors import CORSfrom api.login import loginApp # 【step4】【导入】蓝图-模块文件from api.cookie import cookieAppfrom api.session import sessionAppfrom api.flaskSQL import sqlAppfrom api.webhook import webhookApp#【核心代码】 【导入】日志工具-函数from utils.logUtils import logUtils#【核心代码】 【导入】uuid工具-函数from utils.uuidUtils import traceIDtraceID=traceID() # 调用traceID() ,生成traceID数据app = Flask(__name__)CORS(app) # 解决跨域app.secret_key = "test2022"app.debug = True# 处理中文乱码# app.config['JSON_AS_ASCII'] = Falseapp.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']=traceIDapp.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 uuid4def 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 bpfrom flask import make_responsefrom flask import current_app # 【核心代码】使用Flask中的current_app# 【核心代码】 【导入】uuid工具-函数from utils.uuidUtils import traceIDtraceID = 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'] = traceIDreturn response
2.测试验证
下面使用apifox对“/login/index”进行验证:
检查点
- “日志文件”有数据写入?
- “日志文件”中的traceID与“response-headers的traceID”一致?
3.总结
缺点 日志信息没有做“数据持久化保存”
优化方案整合ELK或者skywalking

