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编写一个基于终端的实现翻译的脚本
Apr 24 Python
简单讲解Python中的数字类型及基本的数学计算
Mar 11 Python
Python使用Matplotlib实现Logos设计代码
Dec 25 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
python 求1-100之间的奇数或者偶数之和的实例
Jun 11 Python
Python中print函数简单使用总结
Aug 05 Python
python函数声明和调用定义及原理详解
Dec 02 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
python识别围棋定位棋盘位置
Jul 26 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
javascript onmouseout 解决办法
2010/07/17 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python 网络编程常用代码段
2016/08/28 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
numpy 声明空数组详解
2019/12/05 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
服装设计专业毕业生推荐信
2013/11/09 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
美食节策划方案
2014/05/26 职场文书
2016大学军训心得体会
2016/01/11 职场文书
同学会演讲稿
2019/04/02 职场文书