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脚本将绝对url替换为相对url的教程
Apr 24 Python
python使用mailbox打印电子邮件的方法
Apr 30 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python序列操作之进阶篇
Dec 08 Python
python构建自定义回调函数详解
Jun 20 Python
基于Python实现的微信好友数据分析
Feb 26 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
Python pandas DataFrame操作的实现代码
Jun 21 Python
Django应用程序入口WSGIHandler源码解析
Aug 05 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 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处理斐波那契数列非递归方法
2012/02/04 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
ThinkPHP5框架缓存查询操作分析
2018/05/30 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
深入理解python对json的操作总结
2017/01/05 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
采购意向书范本
2014/03/31 职场文书
怎样写离婚协议书
2014/09/10 职场文书
支教个人总结
2015/03/04 职场文书
中标通知书范本
2015/04/17 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python