引言 本文将对上一篇《1.【最简】Flask日志记录》进行一些优化改进,如下所示: 优化点

  1. 【封装】日志功能单独封装成“工具类/函数”。
  2. 【本地保存】日志信息进行“本地文件保存”。
  3. 【(简易版)链路跟踪】“蓝图”结合uuid进行API请求/响应的“唯一定义”。

1.代码实现

1.【封装】日志工具(函数)

1.【实现】日志工具

  1. # -*- coding: utf-8 -*-
  2. """
  3. ====================================
  4. @File Name :logUtils.py
  5. @Time : 2022/4/30 22:50
  6. @Program IDE :PyCharm
  7. @Create by Author : 一一Cooling
  8. ====================================
  9. """
  10. import logging
  11. from logging.handlers import TimedRotatingFileHandler
  12. # logUtils()函数:【参数:app--->we为Flask的实例化对象】
  13. def logUtils(app):
  14. logFilePtah = "./resource/flask.log"
  15. formatter = logging.Formatter(f"[[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s][%(thread)d]] - %(message)s")
  16. handler = TimedRotatingFileHandler(logFilePtah, when="D", interval=1, backupCount=15, encoding="UTF-8", delay=False,
  17. utc=True)
  18. app.logger.addHandler(handler)
  19. handler.setFormatter(formatter)

2.【集成关联】Flask实例化对象

  1. #!/usr/bin/env pytho
  2. # -*- coding: utf-8 -*-
  3. """
  4. @author:cooling
  5. @file:main.py
  6. @time:2022/04/16
  7. """
  8. import resource.flaskConfig as config1
  9. from flask import Flask,make_response
  10. from flask_cors import CORS
  11. from api.login import loginApp # 【step4】【导入】蓝图-模块文件
  12. from api.cookie import cookieApp
  13. from api.session import sessionApp
  14. from api.flaskSQL import sqlApp
  15. from api.webhook import webhookApp
  16. #【核心代码】 【导入】日志工具-函数
  17. from utils.logUtils import logUtils
  18. #【核心代码】 【导入】uuid工具-函数
  19. from utils.uuidUtils import traceID
  20. traceID=traceID() # 调用traceID() ,生成traceID数据
  21. app = Flask(__name__)
  22. CORS(app) # 解决跨域
  23. app.secret_key = "test2022"
  24. app.debug = True
  25. # 处理中文乱码
  26. # app.config['JSON_AS_ASCII'] = False
  27. app.config.from_object(config1)
  28. # 【step5】 注册:蓝图对象
  29. # loginApp.register_blueprint(cookieApp) # 将cookieApp嵌套绑定到loginApp上
  30. app.register_blueprint(loginApp)
  31. app.register_blueprint(cookieApp)
  32. app.register_blueprint(sessionApp)
  33. app.register_blueprint(sqlApp)
  34. app.register_blueprint(webhookApp)
  35. # 【核心代码】【使用/绑定】日志工具函数
  36. logUtils(app)
  37. @app.get("/")
  38. def index():
  39. response=make_response("这是主页")
  40. response.headers['traceID']=traceID
  41. app.logger.info(f"[traceID={traceID}]\t主页...]")
  42. return response
  43. # if __name__ == '__main__':
  44. # app.run(port=8806,host="0.0.0.0",debug=True)

image.png

2.【封装】uuid工具(函数)

  1. # -*- coding: utf-8 -*-
  2. """
  3. ====================================
  4. @File Name :uuidUtils.py
  5. @Time : 2022/5/1 10:23
  6. @Program IDE :PyCharm
  7. @Create by Author : 一一Cooling
  8. ====================================
  9. """
  10. from uuid import uuid4
  11. def traceID():
  12. traceID = str(uuid4()).replace("-", "")
  13. # print("当前的traceID:\t",traceID)
  14. return traceID
  15. # if __name__ == '__main__':
  16. # traceID()

3.【整合】蓝图视图模块

【(简易版)链路跟踪】“蓝图”结合uuid进行API请求/响应的“唯一定义”。

  1. #!/usr/bin/env pytho
  2. # -*- coding: utf-8 -*-
  3. """
  4. @author:cooling
  5. @file:login.py
  6. @time:2022/04/16
  7. """
  8. # 【step1】导入 蓝图[Blueprint]
  9. from flask import Blueprint as bp
  10. from flask import make_response
  11. from flask import current_app # 【核心代码】使用Flask中的current_app
  12. # 【核心代码】 【导入】uuid工具-函数
  13. from utils.uuidUtils import traceID
  14. traceID = traceID() # 调用traceID() ,生成traceID数据
  15. # 【step2】 声明-蓝图-->参数:定义蓝图的名字;导入__name__
  16. loginApp = bp("loginApp", __name__, url_prefix="/login")
  17. # 【step3】定义:蓝图视图函数
  18. @loginApp.get("/index")
  19. def login():
  20. # 【核心代码】定义:error日志
  21. current_app.logger.info(f"[traceID={traceID}]\tlogin(主)页面...]")
  22. response = make_response("这是login(主)页面")
  23. # 【核心代码】将“traceID”设置到“repsonse的headers”中
  24. response.headers['traceID'] = traceID
  25. return response

2.测试验证

下面使用apifox对“/login/index”进行验证:
检查点

  1. “日志文件”有数据写入?
  2. “日志文件”中的traceID与“response-headers的traceID”一致?

image.png

3.总结

缺点 日志信息没有做“数据持久化保存”
优化方案整合ELK或者skywalking