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 Django批量导入不重复数据
Mar 25 Python
python数据处理实战(必看篇)
Jun 11 Python
Python之str操作方法(详解)
Jun 19 Python
python 日期操作类代码
May 05 Python
详解Python的数据库操作(pymysql)
Apr 04 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Django 批量插入数据的实现方法
Jan 12 Python
如何理解Python中包的引入
May 29 Python
Python Unittest原理及基本使用方法
Nov 06 Python
python读取mnist数据集方法案例详解
Sep 04 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
php下MYSQL limit的优化
2008/01/10 PHP
PHP的拦截器实例分析
2014/11/03 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python struct.unpack
2008/09/06 Python
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
Python 的 Socket 编程
2015/03/24 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
Python合并多个Excel数据的方法
2018/07/16 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
初中班级口号
2014/06/09 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
查摆问题整改措施
2014/10/24 职场文书
营销经理工作检讨书
2014/11/03 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
2015年母亲节寄语
2015/03/23 职场文书
报案材料怎么写
2015/05/25 职场文书
php字符串倒叙
2021/04/01 PHP