美文网首页
Flask记录每个请求以及每个请求所对应的响应日志

Flask记录每个请求以及每个请求所对应的响应日志

作者: mengkaidi | 来源:发表于2019-05-27 14:08 被阅读0次

首先,是要记录每个请求的日志,在每个接口函数中都记录日志的话,代码量看着比较大而且不美观,于是想到能不能用一个函数进行统一的处理,这个时候flask的钩子函数们又要派上用场啦。

  1. 在 before_app_request 中记录每个请求的记录
    开发的过程中采用了前后端分离,前后端通过json格式进行数据交互,涉及到文件上传的个别接口使用了表单的提交方式,代码如下:
@api.before_app_request
def before_app_request():
    api_name = request.url
    try:
       #收到的前端数据
        request_data = json.loads(request.get_data())
    except Exception as e:
        request_data = request.form.to_dict()
    redis_log_format('R', api_name, None, str(request_data))
  1. 在 after_app_request 中记录每个请求对应的响应记录
@api.after_app_request
def after_app_request(response):
    api_name = request.url
    #返回给前端的数据,全部为json类型
    response_data = response.json
    if str(response.status_code).startswith('4') or str(response.status_code).startswith('5') :
         redis_log_format('E', api_name, response.status_code, str(response_data))
    else:
         redis_log_format('I', api_name, response.status_code,  str(response_data))
    #别忘记将response返回,否则数据到不了前端
    return response
  1. 用函数事先约定好日志记录的格式
    为了减小IO操作对程序效率的影响,也为了避免多进程进行IO操作时带来的冲突,可以先把日志存到redis中,之后再用异步线程或者单独的进程将redis中的日志按照日期读到磁盘文件中,代码如下:
def redis_log_format(level, url, status_code, message): #status_code为状态码,请求日志中为None
    # 定义日志的层级
    level_dict = { "I":"INFO",  "W":"WARNING", "E":"ERROR", 'R':"REQUEST"}
  
    now = datetime.now()
    asctime = now.strftime('%Y-%m-%d %H:%M:%S')
    levelname = level_dict.get(level, 'INFO')
    process = os.getpid()
    thread = threading.currentThread().ident
    #定义日志的格式 采用f‘’的方式格式化字符串
    strMessage =  f'{asctime} {levelname} {process} {thread} {url} {status_code} {message}'
    #将日志存放到redis中的有序集合中,用时间戳作为每条日志的得分,同一天的日志放到一个集合中,便于之后按日期保存日志文件
    tablename = str(date.today())
    score= int(now.strftime('%Y%m%d%H%M%S'))
    r.zadd( tablename, { strMessage:score } )

相关文章

  • Flask记录每个请求以及每个请求所对应的响应日志

    首先,是要记录每个请求的日志,在每个接口函数中都记录日志的话,代码量看着比较大而且不美观,于是想到能不能用一个函数...

  • http长/短轮询和WebSocket 的介绍和比较

    【1】http协议介绍 1)介绍:http协议是请求/响应范式的,每个http 响应都对应一个 http 请求,h...

  • Python flask 学习笔记(一)

    一、第一个 flask 程序 二、请求响应流程 请求的上下文 请求调度 请求的前后进行操作 请求响应 小技巧 1....

  • Flask学习日志(四) - Flask请求上下文与响应

    文 / 秦未 OK,今天学习Flask的请求上下文与响应,我们先看一看Flask请求和响应的过程示意图: 首先我们...

  • Flask-请求与响应

    请求与响应 请求对象 在 Flask 中,请求信息被封装到 request 对象中 request常用属性 sch...

  • Python学习

    python-flask框架学习(五) request-Flask的请求对象 请求解析和响应封装大部分是有Werk...

  • Nginx与PHP的交互

    Nginx+PHP的工程模式下,Nginx负责承载HTTP请求的响应与返回,以及超时控制记录日志等HTTP相关的功...

  • 设计模式(二十):命令模式

    命令模式(Command)将请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及...

  • HTTP与TCP协议的区别

    (一) HTTP是应用层协议,负责对请求和响应数据的封装,包括请求方法、请求头和请求正文,以及状态行,响应头和响应...

  • Flask请求-响应循环

    请求-响应循环 1.程序和请求上下文 Flask 使用上下文临时把某些对象变为全局可访问。 在 Flask 中有两...

网友评论

      本文标题:Flask记录每个请求以及每个请求所对应的响应日志

      本文链接:https://www.haomeiwen.com/subject/qnictctx.html