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 18 Python
Python实现全角半角转换的方法
Aug 18 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
pandas apply多线程实现代码
Aug 17 Python
python计算auc的方法
Sep 09 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 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更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
js 小数取整的函数
2010/05/10 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python实现视频下载功能
2017/03/14 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
就业协议书范本
2014/10/08 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
领导参观欢迎词
2015/01/26 职场文书
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
MySQL GTID复制的具体使用
2022/05/20 MySQL