Python如何使用logging为Flask增加logid


Posted in Python onMarch 30, 2021

我们为了问题定位,常见做法是在日志中加入 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获取指定路径下所有指定后缀文件的方法
May 26 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
Python装饰器语法糖
Jan 02 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
python实现祝福弹窗效果
Apr 07 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
如何在Python中创建二叉树
pycharm2021激活码使用教程(永久激活亲测可用)
python实现web邮箱扫描的示例(附源码)
python函数指定默认值的实例讲解
Mar 29 #Python
pytest进阶教程之fixture函数详解
python中pandas.read_csv()函数的深入讲解
Mar 29 #Python
python编写函数注意事项总结
Mar 29 #Python
You might like
PHP6 mysql连接方式说明
2009/02/09 PHP
php自动获取目录下的模板的代码
2010/08/08 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
wxPython之解决闪烁的问题
2018/01/15 Python
django ajax json的实例代码
2018/05/29 Python
一看就懂得Python的math模块
2018/10/21 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
零基础学python应该从哪里入手
2020/08/11 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
质量承诺书范文
2014/03/27 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
大学生求职信范文
2014/05/24 职场文书
相亲活动方案
2014/08/26 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
聘任书的格式及模板
2019/10/28 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android