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实现简单QQ单用户机器人的方法
Jul 03 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
python实现聊天小程序
Mar 13 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
python cv2图像质量压缩的算法示例
Jun 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
改造一台复古桌面收音机
2021/03/02 无线电
php生成图形(Libchart)实例
2013/11/06 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
jquery弹出框的用法示例(一)
2013/08/26 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
JavaScript模块详解
2017/12/18 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
python爬取网页转换为PDF文件
2018/06/07 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
如何通过python实现人脸识别验证
2020/01/17 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
final, finally, finalize的区别
2012/03/01 面试题
工作调动申请报告
2015/05/18 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python