Python如何使用logging为Flask增加logid

  • 更新时间:2022-09-07 08:43:13
  • 编辑:阎宏儒
为网友们分享了Python相关的编程文章,网友幸雯华根据主题投稿了本篇教程内容,涉及到python、使用logging、Python为Flask增加logid、Python为Flask增加logid相关内容,已被401网友关注,内容中涉及的知识点可以在下方直接下载获取。

参考资料

正文内容

Python为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相关教程

  • python flask 多对多表查询功能

    给网友朋友们带来一篇关于python的教程,我们在flask的学习中,会难免遇到多对多表的查询,今天我也遇到了这个问题。下面把我的思路分享到脚本之家平台,供大家参考

    发布时间:2022-09-06

  • Python实现区域填充的示例代码

    这篇文章主要介绍了Python实现区域填充的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    发布时间:2021-09-26

  • python实现字典(dict)和字符串(string)转换的实例

    这篇文章主要介绍了python实现字典(dict)和字符串(string)的相互转换方法,涉及Python字典dict的遍历与字符串转换相关操作技巧,需要的朋友可以参考下

    发布时间:2019-09-16

  • python测试opencv时imread导致的错误解决方法

    今天小编就为大家分享一篇解决python测试opencv时imread导致的错误问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2019-06-05

  • Python Opencv实战之印章提取的实现

    Python Opencv实战之印章提取的实现

    给大家整理了关于Python的教程,很多时候我们需要电子版的章,但有些同学并不会通过Photoshop抠图获取。因此本文将利用Python OpenCV来实现印章的提取,感兴趣的可以了解一下

    发布时间:2022-07-07

  • python用户管理系统实例详解

    本文主要为大家分享一篇python用户管理系统的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。

    发布时间:2019-09-05

  • 学习python要安装什么软件

    Python开发软件可根据其用途不同分为两种,一种是Python代码编辑器,一种是Python集成开发工具。如Sublime Text、Atom、PyCharm、Visual Studio等等。

    发布时间:2020-01-26

  • python实现录音小程序的代码和方法

    这篇文章主要为大家详细介绍了python实现录音小程序,实现录音播放功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    发布时间:2019-11-23

  • python range()函数取反序遍历sequence的实例讲解

    今天小编就为大家分享一篇python range()函数取反序遍历sequence的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2021-05-10

  • Python正则表达式使用实例详解

    本文给大家总结了7个常用的Python正则表达式的使用范例以及简单解释分析,有需要的小伙伴可以参考下

    发布时间:2019-11-12

用户留言