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重试装饰器示例
Feb 11 Python
python操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python字典get()方法用法分析
Apr 17 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
Python异常处理操作实例详解
Aug 28 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
Python中format()格式输出全解
Apr 12 Python
python binascii 进制转换实例
Jun 12 Python
超简单的Python HTTP服务
Jul 22 Python
基于Django统计博客文章阅读量
Oct 29 Python
Scrapy爬虫文件批量运行的实现
Sep 30 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
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
python字典排序实例详解
2015/05/20 Python
python 产生token及token验证的方法
2018/12/26 Python
python调用c++传递数组的实例
2019/02/13 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
人事行政主管岗位职责
2013/12/22 职场文书
小学生倡议书范文
2014/05/13 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
整改报告怎么写
2014/11/06 职场文书
销售2014年度工作总结
2014/12/08 职场文书
北京导游词
2015/02/12 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
go结构体嵌套的切片数组操作
2021/04/28 Golang
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫