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实现Tab自动补全和历史命令管理的方法
Mar 12 Python
python查询sqlite数据表的方法
May 08 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python实现二维数组输出为图片
Apr 03 Python
对python中raw_input()和input()的用法详解
Apr 22 Python
django自带的server 让外网主机访问方法
May 14 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Python3远程监控程序的实现方法
Jul 15 Python
Pytorch中index_select() 函数的实现理解
Nov 19 Python
Django多个app urls配置代码实例
Nov 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
5.PHP的其他功能
2006/10/09 PHP
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python实现按任意键继续执行程序
2016/12/30 Python
一百多行python代码实现抢票助手
2018/09/25 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Pycharm中如何关掉python console
2020/10/27 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
幼儿园教师培训方案
2014/02/04 职场文书
手机被没收检讨书
2014/02/22 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
个人投资合作协议书
2014/10/12 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
2015年校长新年寄语
2014/12/08 职场文书
《落花生》教学反思
2016/02/16 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技