Python如何使用logging为Flask增加logid
- 更新时间:2022-09-07 08:43:13
- 编辑:阎宏儒
参考资料
- Selenium模拟浏览器万能爬虫指南(python篇) / 385 KB / 孟昊天 推荐度:
- 《趣学Python算法100例》源代码 配套资源 / 35.6 MB / 刘河飞 闫凯峰 推荐度:
- Effective Python:编写高质量Python代码的59个有效方法 PDF 电子书 / 35.5 MB / 布雷特·斯拉特金 推荐度:
正文内容
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的教程,很多时候我们需要电子版的章,但有些同学并不会通过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