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开发之文件操作用法实例
Nov 13 Python
Python优先队列实现方法示例
Sep 21 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python实现的购物车功能示例
Feb 11 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
python+openCV利用摄像头实现人员活动检测
Jun 22 Python
python3下pygame如何实现显示中文
Jan 11 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
Python 如何在字符串中插入变量
Aug 01 Python
Python Map 函数的使用
Aug 28 Python
详解Anaconda 的安装教程
Sep 23 Python
python与idea的集成的实现
Nov 20 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下批量挂马和批量清马代码
2011/02/27 PHP
php封装的page分页类完整实例
2016/10/18 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
自定义vue组件发布到npm的方法
2018/05/09 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
基于python实现删除指定文件类型
2020/07/21 Python
Python实现微信表情包炸群功能
2021/01/28 Python
完整版商业计划书
2014/09/15 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
大明湖导游词
2015/02/03 职场文书
企业战略合作意向书
2015/05/08 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers
Java实现注册登录跳转
2022/06/16 Java/Android