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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
Python正则简单实例分析
Mar 21 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
python 如何引入协程和原理分析
Nov 30 Python
Python更改pip镜像源的方法示例
Dec 01 Python
python 调用js的四种方式
Apr 11 Python
学会Python数据可视化必须尝试这7个库
Jun 16 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
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
php防止用户重复提交表单
2015/11/02 PHP
php日期操作技巧小结
2016/06/25 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
js更优雅的兼容
2010/08/12 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
详解package.json版本号规则
2019/08/01 Javascript
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
python实现爬虫下载漫画示例
2014/02/16 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
外贸英语毕业生自荐信
2013/11/14 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
写给领导的感谢信
2015/01/22 职场文书
行政复议答复书
2015/07/01 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang