当前位置: 首页 > news >正文

青岛做网站皆赴青岛博四川大学规划建设处官方网站

青岛做网站皆赴青岛博,四川大学规划建设处官方网站,seo是什么意思紧要,网站建设设计技术方案模板下载目录 一. 简介#xff1a; 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建#xff08;包含日志记录的关键字段#xff09; 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展… 目录 一. 简介 1. 为什么需要请求日志 二.  日志模块组成 1.  对应日志表创建包含日志记录的关键字段 2.  编写日志记录静态方法 3.  在Flask中捕获请求日志 4.  捕获异常并记录错误日志 5.  编写日志接口数据展示 6.  写入数据展示 三. 日志信息格式处理问题 1. 如何处理流式响应Passthrough 2. 如何记录响应数据如JSON响应 3. 总结与优化建议 四 . 结尾 一. 简介 在Flask应用中日志记录是重要的功能之一它可以帮助开发人员跟踪请求的处理情况快速定位错误并且有助于应用的监控与调试。本文将介绍如何在Flask应用中实现请求日志记录包括如何记录请求的各种信息如请求数据、响应数据、错误信息等并将其保存到数据库中。我们还会演示如何捕获不同级别的日志信息级别、错误级别并讨论如何处理复杂的响应数据如流式响应。 1. 为什么需要请求日志 日志记录可以帮助开发人员和运维团队了解应用的行为和状态尤其是在生产环境中。通过记录每次请求的详细信息开发人员能够 跟踪应用性能。快速定位和调试错误。为监控和安全审计提供数据支持。 例如在出现错误时记录详细的堆栈信息、请求的URL、请求参数和响应数据能够帮助你迅速分析问题并进行修复。 二.  日志模块组成 1.  对应日志表创建包含日志记录的关键字段 # 日志表 class Log(db.Model,TimestampMixin):日志表__tablename__ t_logs__table_args__ {mysql_engine: InnoDB,comment: 日志表}id db.Column(db.Integer, primary_keyTrue, autoincrementTrue,commentid)user_id db.Column(db.Integer,comment用户ID) # 用户IDip_address db.Column(db.String(50),commentip地址) # ip地址level db.Column(db.String(50),comment日志级别) # 日志级别message db.Column(db.Text,comment日志内容) # 日志内容module db.Column(db.String(100),comment模块名称) # 模块名称method db.Column(db.String(50),comment方法名称) # 方法名称url db.Column(db.String(255),comment请求的URL) # 请求的URLrequest_data db.Column(db.Text,comment请求数据) # 请求数据response_data db.Column(db.Text,comment响应数据) # 响应数据error_code db.Column(db.String(50),comment错误代码) # 错误代码stack_trace db.Column(db.Text,comment堆栈追踪) # 堆栈追踪hostname db.Column(db.String(100),comment服务器主机名) # 服务器主机名context db.Column(db.String(255),comment上下文信息) # 上下文信息def __repr__(self):return fErrorLog(id{self.id}, ip_address{self.ip_address}, level{self.level}, message{self.message})2.  编写日志记录静态方法 # db.session 进行数据提交等操作staticmethoddef log_message(session, exceptionNone, user_idNone,error_codeNone,levelNone, messageNone, **kwargs):try:# 获取请求数据request_dataif request.method GET:request_data str(dict(request.args)) # 直接获取查询参数elif request.method POST:if request.is_json:request_data str(request.get_json()) # 获取 JSON 数据else:request_data str(request.form) # 获取表单数据# 获取请求的其他信息ip_address request.remote_addr # 获取客户端IP地址url request.url # 获取请求的URLresponse_data str(kwargs.get(response_data, )) # 获取响应数据stack_trace traceback.format_exc() if exception else # 获取堆栈追踪hostname socket.gethostname() # 获取服务器主机名context kwargs.get(context, Production) # 上下文默认生产环境if not message:message str(exception) if exception else Unknown error# 检查错误响应数据并跳过日志记录try:# 将响应数据从字符串转换为字典response_dict json.loads(response_data)if isinstance(response_dict, dict) and response_dict.get(message) 内部服务器错误:return # 跳过日志记录except json.JSONDecodeError:# 如果无法解析 JSON则跳过判断pass# print(user_id)# 创建并保存日志条目log Log(user_iduser_id if user_id else 0,levellevel,messagemessage,ip_addressip_address,urlurl,request_datarequest_data,response_dataresponse_data,stack_tracestack_trace,hostnamehostname,contextcontext,methodrequest.method,modulerequest.blueprint,error_codeerror_code,)# 保存日志条目db.session.add(log)db.session.commit()except Exception as e:print(e)pass 3. 在Flask中捕获请求日志 在Flask中我们可以通过使用 after_request 钩子来捕获请求信息。这个钩子在每次请求处理完毕后执行适合用于记录日志。示例如下 # 请求成功日志记录 app.after_request def after_request(response):# 获取当前用户信息user_id Nonelevel INFO # 你可以根据需要动态设置日志级别如根据响应状态码判断message 请求成功! # 请求成功的默认信息# 记录日志try:current_user get_jwt_identity()# 获取用户信息从数据库中获取用户信息做对比user_info db.session.query(User).filter(User.username current_user).first()user_id user_info.idexcept RuntimeError as e:# 捕获没有 JWT 时抛出的 RuntimeError 异常# 不做任何事情直接跳过日志记录passexcept Exception as e:print(e)pass# 如果响应处于 passthrough 模式则不能直接访问 response.dataif not response.direct_passthrough:# 正常情况下获取响应数据并转化为文本response_data response.get_data(as_textTrue)else:# 如果是 passthrough 模式说明是流式响应或直接传递模式response_data {} # 或者根据需求设置适当的默认值if user_id:Log.log_message(db.session,user_iduser_id if user_id else 0,levellevel,messagemessage,response_dataresponse_data,contextProduction, # 可选的环境信息error_code200,)return response在这个例子中我们通过 after_request 钩子来处理每个请求后执行的日志记录。获取响应数据时根据响应的类型决定是否直接获取 response.data。 4. 捕获异常并记录错误日志 在实际开发中应用程序往往会遇到异常。为了保证日志的完整性我们可以捕获异常并将其记录下来。特别是对于HTTP 500类错误应该记录详细的堆栈信息。 # 异常处理日志记录 app.errorhandler(Exception) def handle_exception(e):# 捕获所有异常记录日志level ERRORmessage str(e) # 将异常转换为字符串stack_trace traceback.format_exc() # 获取堆栈追踪# 获取当前用户信息user_id Nonetry:current_user get_jwt_identity()user_info db.session.query(User).filter(User.username current_user).first()user_id user_info.idexcept RuntimeError:# 如果没有 JWT 则不记录用户IDpassif user_id:# 记录异常日志Log.log_message(db.session,exceptione,user_iduser_id,levellevel,message请求失败!,stack_tracestack_trace,contextProduction,error_code500,)print(message)# 返回通用的500错误响应return {message: 内部服务器错误}, 500 在这个例子中我们捕获了通用的异常并将错误信息、堆栈追踪以及其他日志信息保存到数据库。 5. 编写日志接口数据展示 from flask import Response, jsonify, Flask, request, Blueprint,url_for from configs import * from modules.Tables import * from sqlalchemy import func# 创建蓝图对应的register目录激活操作视图 log_view Blueprint(log_view, __name__)# 日志信息展示 log_view.route(/log_data, methods[GET]) jwt_required() def log_data():# 获取分页参数page request.args.get(page, default1, typeint) # 当前页码per_page request.args.get(per_page, default15, typeint) # 每页显示条目数量level request.args.get(level) # 日志等级# 定义筛选列表filters []# 当筛选条件存在时添加到列表if level:filters.append(Log.level level)# 构建查询条件query and_(*filters) if filters else True # 如果 filters 为空默认条件为 True# 查询主区域点并进行分页pagination db.session.query(Log.id,Log.user_id,Log.ip_address, Log.level,Log.message,Log.module,Log.method,Log.url,Log.request_data, Log.response_data,Log.error_code, Log.stack_trace,Log.hostname,Log.context,Log.created_at).filter(query).paginate(pagepage, per_pageper_page, error_outFalse)# 获取分页后的数据data_list [{id: item.id,user_id: item.user_id,ip_address: item.ip_address,level: item.level,message: item.message,module: item.module,method: item.method,url: item.url,request_data: item.request_data if item.response_data else item.stack_trace,response_data: item.response_data,error_code: item.error_code,# stack_trace:item.stack_trace,hostname:item.hostname,context:item.context,created_at: format_datetime(item.created_at),}for item in pagination.items]# 构造返回结果包括分页信息response {code: 200,data: data_list,pagination: {current_page: pagination.page,total_pages: pagination.pages,total_items: pagination.total,per_page: pagination.per_page}}return jsonify({code:200,data:response}) 6. 写入数据展示 三. 日志信息格式处理问题 1. 如何处理流式响应Passthrough Flask中的流式响应passthrough不允许直接访问 response.data因此需要特别处理。通过 response.get_data(as_textTrue) 方法我们可以安全地获取响应数据并将其存储到日志中。如果响应不可序列化如流式数据可以跳过或记录默认值。 if not response.direct_passthrough:response_data response.get_data(as_textTrue) else:response_data Non-serializable response2. 如何记录响应数据如JSON响应 对于返回JSON数据的响应我们可以通过 response.get_data(as_textTrue) 获取响应体的内容。这种方式适用于大多数JSON响应确保我们可以将响应内容记录到日志中。 例如在捕获日志时我们可以如下处理响应数据 response_data response.get_data(as_textTrue)对于非JSON响应使用 str() 也能保证将其转化为可记录的格式。 3. 总结与优化建议 在Flask应用中通过 app.after_request 钩子可以轻松地记录每次请求的日志。根据不同的请求方法GET/POST和响应类型JSON、流式数据等动态调整日志记录方式。使用 try-except 语句捕获异常并记录详细的错误信息以帮助后期的调试和维护。 通过这些方法我们可以高效、全面地记录Flask应用中的日志并为后期的性能优化、故障排查提供支持。 四 . 结尾 日志记录是开发和运维过程中不可或缺的一部分它能帮助我们及时发现问题并做出调整。通过本文介绍的日志记录方式我们能够方便地捕获请求和响应的详细信息同时处理各种异常和特殊情况。希望这篇文章能够帮助你更好地理解并实现Flask中的日志记录。
http://www.w-s-a.com/news/953724/

相关文章:

  • 免费建设网站赚钱小程序开发文档pdf
  • ucenter 整合两个数据库网站网店推广技巧
  • 网站优化排名提升百度wap
  • 八里河风景区网站建设内容摘要网站开发基础学习
  • 上海做外贸网站的公司智慧团建网站登陆平台
  • 上海商务网站建设如何做的网站手机可以用吗
  • 产品推广营销方案seo推广员招聘
  • 做水利网站需要多少钱山东市网站建设
  • 做网站找哪里如何修改wordpress颜色
  • 招商加盟网站系统站长工具 seo查询
  • 工商局网站清算组备案怎么做电商培训机构
  • 做好门户网站建设做本地团购网站怎么样
  • wordpress主题和预览不同20条优化防疫措施方案
  • 艾奇视觉网站建设网站推广需要几个人做
  • 2008 iis 添加网站wordpress固定链接标签加上页面
  • 宁波企业网站制作推荐网站优化人员
  • 大型资讯门户网站怎么做排名沈阳建设工程有限公司
  • 开发中英文切换网站如何做江苏网站建设费用
  • 网站论文首页布局技巧桥东网站建设
  • 网站开发项目经理工资北京微信网站
  • 山西山西省建设厅网站微信备份如何转换为wordpress
  • 同城网站开发实用网站模板
  • 郑州做网站哪家公司好国外购买空间的网站有哪些
  • 资讯cms网站有那些餐饮品牌策划设计公司
  • 网站策划选题网站布局优化
  • 网站建设3000字wordpress 微信 主题制作
  • 代做寄生虫网站网站菜单效果
  • 网站备案为什么这么慢目录更新 wordpress
  • 视频在线制作网站Wordpress 外链图片6
  • 网站域名后缀有什么用网站建设的投资预算怎么写