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 相关文章推荐
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
教大家玩转Python字符串处理的七种技巧
Mar 31 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
Python统计单词出现的次数
Apr 04 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
python dict如何定义
Sep 02 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
LeetCode189轮转数组python示例
Aug 05 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实现上传文件并存进数据库的方法
2015/07/16 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
脚本收藏iframe
2006/07/21 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
js验证账户名是否重复
2020/05/26 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
python用字典统计单词或汉字词个数示例
2014/04/22 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
计算机工程学院个人求职信
2013/10/05 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
活动总结范文
2014/08/30 职场文书
2014年实习期工作总结
2014/11/27 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
七年级数学教学反思
2016/02/17 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书