• 售前

  • 售后

热门帖子
入门百科

Python怎样使用logging为Flask增长logid

[复制链接]
芊芊551 显示全部楼层 发表于 2021-10-26 14:02:24 |阅读模式 打印 上一主题 下一主题
目录


  • logid保存与转达
  • 打印日记自动带上logid
我们为了问题定位,常见做法是在日记中到场 logid,用于关联一个请求的上下文。这就涉及两个问题:1. logid 这个“全局”变量如何保存转达。2. 如何让打印日记的时间自动带上 logid(究竟不能每个打日记的地方都手动传入)

logid保存与转达


传统做法就是讲 logid 保存在 threading.local 里面,一个线程里都是一样的值。在 before_app_request 就生成好,logid并放进去。
  1. import threading
  2.  
  3. from blueprint.hooks import hooks
  4.  
  5. thread_local = threading.local()
  6. app = Flask()
  7. app.thread_local = thread_local
复制代码
  1. import uuid
  2.  
  3. from flask import Blueprint
  4. from flask import current_app as app
  5.  
  6. hooks = Blueprint('hooks', __name__)
  7.  
  8. @hooks.before_app_request
  9. def before_request():
  10.     """
  11.     处理请求之前的钩子
  12.     :return:
  13.     """
  14.     # 生成logid
  15.     app.thread_local.logid = uuid.uuid1().time
复制代码
由于需要一个数字的 logid 所以简单使用 uuid.uuid1().time 一样平常并发完全够了,不会重复且趋势递增(看logid就能知道请求的早晚)。

打印日记自动带上logid


这个就是 Python 日记库自带的功能了,可以使用 Filter 来实现这个需求。
  1. import logging
  2.  
  3. # https://docs.python.org/3/library/logging.html#logrecord-attributes
  4. log_format = "%(asctime)s %(levelname)s [%(threadName)s-%(thread)d] %(logid)s %(filename)s:%(lineno)d %(message)s"
  5. file_handler = logging.FileHandler(file_name)
  6. logger = logging.getLogger()
  7. logid_filter = ContextFilter()
  8. file_handler.addFilter(logid_filter)
  9. file_handler.setFormatter(logging.Formatter(log_format))
  10. logger.addHandler(file_handler)
  11.  
  12. class ContextFilter(logging.Filter):
  13.     """
  14.     logging Filter
  15.     """
  16.  
  17.     def filter(self, record):
  18.         """
  19.         threading local 获取logid
  20.         :param record:
  21.         :return:
  22.         """
  23.         log_id = thread_local.logid if hasattr(thread_local, 'logid') else '-'
  24.         record.logid = log_id
  25.  
  26.         return True
复制代码
log_format 中我们用了很多体系自带的占位符,但 %(logid)s 默认没有的。每条日记打印输出前都会过 Filter,使用此特征我们就可以把 record.logid 赋值上,终极打印出来的时间就有 logid 了。
虽然终极实现了,但由于是通用化方案,所以有些复杂了。其实官方教程中先容了一种更加简单的方式:injecting-request-information,看来没事还得多看看官方文档。
以上就是Python如何使用logging为Flask增加logid的详细内容,更多关于Python为Flask增加logid的资料请关注草根技术分享其它相关文章!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作