• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python如何使用logging为Flask增加logid

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

    logid保存与传递

    传统做法就是讲 logid 保存在 threading.local 里面,一个线程里都是一样的值。在 before_app_request 就生成好,logid并放进去。

    import threading
     
    from blueprint.hooks import hooks
     
    thread_local = threading.local()
    app = Flask()
    app.thread_local = thread_local
    import uuid
     
    from flask import Blueprint
    from flask import current_app as app
     
    hooks = Blueprint('hooks', __name__)
     
    @hooks.before_app_request
    def before_request():
        """
        处理请求之前的钩子
        :return:
        """
        # 生成logid
        app.thread_local.logid = uuid.uuid1().time

    因为需要一个数字的 logid 所以简单使用 uuid.uuid1().time 一般并发完全够了,不会重复且趋势递增(看logid就能知道请求的早晚)。

    打印日志自动带上logid

    这个就是 Python 日志库自带的功能了,可以使用 Filter 来实现这个需求。

    import logging
     
    # https://docs.python.org/3/library/logging.html#logrecord-attributes
    log_format = "%(asctime)s %(levelname)s [%(threadName)s-%(thread)d] %(logid)s %(filename)s:%(lineno)d %(message)s"
    file_handler = logging.FileHandler(file_name)
    logger = logging.getLogger()
    logid_filter = ContextFilter()
    file_handler.addFilter(logid_filter)
    file_handler.setFormatter(logging.Formatter(log_format))
    logger.addHandler(file_handler)
     
    class ContextFilter(logging.Filter):
        """
        logging Filter
        """
     
        def filter(self, record):
            """
            threading local 获取logid
            :param record:
            :return:
            """
            log_id = thread_local.logid if hasattr(thread_local, 'logid') else '-'
            record.logid = log_id
     
            return True

    log_format 中我们用了很多系统自带的占位符,但 %(logid)s 默认没有的。每条日志打印输出前都会过 Filter,利用此特征我们就可以把 record.logid 赋值上,最终打印出来的时候就有 logid 了。

    虽然最终实现了,但因为是通用化方案,所以有些复杂了。其实官方教程中介绍了一种更加简单的方式:injecting-request-information,看来没事还得多看看官方文档。

    以上就是Python如何使用logging为Flask增加logid的详细内容,更多关于Python为Flask增加logid的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 解决python logging遇到的坑 日志重复打印问题
    • python 实现logging动态变更输出日志文件名
    • python (logging) 日志按日期、大小回滚的操作
    • Python日志打印里logging.getLogger源码分析详解
    • python 日志模块logging的使用场景及示例
    • Python的logging模块基本用法
    • python 如何对logging日志封装
    • Python logging自定义字段输出及打印颜色
    • Python中logging日志的四个等级和使用
    • Python+logging输出到屏幕将log日志写入文件
    • Python logging模块handlers用法详解
    上一篇:Python爬取科目四考试题库的方法实现
    下一篇:如何在Python中创建二叉树
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python如何使用logging为Flask增加logid Python,如何,使用,logging,为,