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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
python多进程实现进程间通信实例
Nov 24 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
python3.7添加dlib模块的方法
Jul 01 Python
python处理json数据文件
Apr 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 ajax 分页类代码
2008/11/13 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
php定界符
2014/06/19 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
基于js disabled="false"不起作用的解决办法
2013/06/26 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
剖析Python的Twisted框架的核心特性
2016/05/25 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python实现验证码识别功能
2018/06/07 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Python sorted排序方法如何实现
2020/03/31 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
视图的作用
2014/12/19 面试题
2015年女生节活动总结
2015/02/27 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
卫生主题班会
2015/08/14 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技