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编写暴力破解FTP密码小工具
Nov 19 Python
python实现基于两张图片生成圆角图标效果的方法
Mar 26 Python
使用Python脚本来获取Cisco设备信息的示例
May 04 Python
python读取oracle函数返回值
Jul 18 Python
基于Python的关键字监控及告警
Jul 06 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
windows安装python超详细图文教程
May 21 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
自己动手做一个SQL解释器
2006/10/09 PHP
也谈php网站在线人数统计
2008/04/09 PHP
php 魔术方法使用说明
2009/10/20 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
python中hashlib模块用法示例
2017/10/30 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
python如何查看网页代码
2020/06/07 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
恒华伟业笔试面试题
2015/02/26 面试题
林肯就职演讲稿
2014/05/19 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
现场活动策划方案
2014/08/22 职场文书
承诺书模板
2014/08/30 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
指导教师推荐意见
2015/06/05 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL