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简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
python dict 相同key 合并value的实例
Jan 21 Python
Python实现Selenium自动化Page模式
Jul 14 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
django中的数据库迁移的实现
Mar 16 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
python定义类的简单用法
Jul 24 Python
python 提高开发效率的5个小技巧
Oct 19 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
基于python爬取梨视频实现过程解析
Nov 09 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
python 常用的基础函数
2018/07/10 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
python文件路径操作方法总结
2020/12/21 Python
师范院校学生自荐信范文
2013/12/27 职场文书
减负增效提质方案
2014/05/23 职场文书
拔河比赛口号
2014/06/10 职场文书
挂职学习心得体会
2014/09/09 职场文书
体育教师个人工作总结
2015/02/09 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android