时间:2021-05-22
我们为了问题定位,常见做法是在日志中加入 logid,用于关联一个请求的上下文。这就涉及两个问题:1. logid 这个“全局”变量如何保存传递。2. 如何让打印日志的时候自动带上 logid(毕竟不能每个打日志的地方都手动传入)
传统做法就是讲 logid 保存在 threading.local 里面,一个线程里都是一样的值。在 before_app_request就生成好,logid并放进去。
import threadingfrom blueprint.hooks import hooksthread_local = threading.local()app = Flask()app.thread_local = thread_localimport uuidfrom flask import Blueprintfrom flask import current_app as apphooks = Blueprint('hooks', __name__)@hooks.before_app_requestdef before_request():"""处理请求之前的钩子:return:"""# 生成logidapp.thread_local.logid = uuid.uuid1().time因为需要一个数字的 logid 所以简单使用 uuid.uuid1().time 一般并发完全够了,不会重复且趋势递增(看logid就能知道请求的早晚)。
这个就是 Python 日志库自带的功能了,可以使用Filter 来实现这个需求。
import logging# https://docs.python.org/3/library/logging.html#logrecord-attributeslog_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_idreturn Truelog_format 中我们用了很多系统自带的占位符,但 %(logid)s 默认没有的。每条日志打印输出前都会过 Filter,利用此特征我们就可以把 record.logid 赋值上,最终打印出来的时候就有 logid了。
虽然最终实现了,但因为是通用化方案,所以有些复杂了。其实官方教程中介绍了一种更加简单的方式:injecting-request-information,看来没事还得多看看官方文档。
以上就是Python如何使用logging为Flask增加logid的详细内容,更多关于Python为Flask增加logid的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python的logging模块python提供了一个日志处理的模块,那就是logging。导入logging模块使用以下命令:importlogginglog
本文章来为各位介绍一个python的例子,这个就是bootstrap+flask写登录页面的例子,希望文章能够对各位有所帮助。Flask是一个使用Python编
详解使用python的logging模块在stdout输出前言: 使用python的logging模块时,除了想将日志记录在文件中外,还希望在前台执行pyth
Django使用python自带的logging作为日志打印工具。简单介绍下logging。logging是线程安全的,其主要由4部分组成:Logger用户使用
环境:windows10、python3.5、flask-mongoengine0.8.2或0.9.0使用以下命令安装flask-mongoenginepipi