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 相关文章推荐
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
python迭代dict的key和value的方法
Jul 06 Python
python 分离文件名和路径以及分离文件名和后缀的方法
Oct 21 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
python自定义函数def的应用详解
Jun 03 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
python开发实时可视化仪表盘的示例
May 07 Python
Python-OpenCV实现图像缺陷检测的实例
Jun 11 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优化需要注意的地方
2014/11/27 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
简单的js表格操作
2016/09/24 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python解析xml文件操作实例
2014/10/05 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
python使用matplotlib绘制热图
2018/11/07 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
django框架中间件原理与用法详解
2019/12/10 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Python代码需要缩进吗
2020/07/01 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
巴西手表购物网站:eclock
2019/03/19 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
2014年最新领导班子整改方案
2014/09/27 职场文书
信访稳定工作汇报
2014/10/27 职场文书
行政司机岗位职责
2015/04/10 职场文书
汉语拼音教学反思
2016/02/22 职场文书
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python