Django中间件实现操作日志

本文通过Django中间件的流程,实现操作日志记录的功能,模块化、拿来即用。

功能描述:通过中间件记录 请求时间操作用户请求URL请求方法请求IP请求参数响应数据响应耗时等数据日志,而且可以自定义exclude_urls列表,访问列表中的url,不会保存操作日志。另外,通过设置的响应时间阈值(可配置化),将超过阈值的操作日志进行单独保存,便于分析。

说明:示例中是将数据记录在MySQL数据库中,如果你想写入log日志,只需将数据入库改为log格式写入即可(数据都放在self.data中,取用方便)。

创建中间件

  1. 在app下新建文件夹middlewares, 在文件夹下新建中间件文件LogMiddleware.py

  2. 在中间件文件中新建一个类, 继承MiddlewareMixin:

    from django.utils.deprecation import MiddlewareMixinclass OpLogs(MiddlewareMixin):def process_request(self, request):pass
    
  3. 在settings中注册中间件:

    # 自定义中间件
    MIDDLEWARE += ['app01.middlewares.LogMiddleware.OpLogs'
    ]
    

功能实现

  1. LogModdleware.py中间件:
    获取需要记录的参数,并计算请求耗时,将参数入库。

    # -*- coding:utf-8 -*-
    """
    @File   : LogMiddleware.py
    @Author : Python
    @Date   : 2021/7/20 14:00
    """
    import time
    import jsonfrom django.utils.deprecation import MiddlewareMixinfrom app.models import OpLogs, AccessTimeOutLogsclass OpLogs(MiddlewareMixin):__exclude_urls = ['index/']   # 定义不需要记录日志的url名单def __init__(self, *args):super(OpLog, self).__init__(*args)self.start_time = None  # 开始时间self.end_time = None # 响应时间self.data = {}       # dict数据def process_request(self, request):"""请求进入:param request: 请求对象:return:"""self.start_time = time.time()   # 开始时间re_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())  # 请求时间(北京)# 请求IPx_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')if x_forwarded_for:# 如果有代理,获取真实IPre_ip = x_forwarded_for.split(",")[0]else:re_ip = request.META.get('REMOTE_ADDR')# 请求方法re_method = request.method# 请求参数re_content = request.GET if re_method == 'GET' else request.POSTif re_content:# 筛选空参数re_content = json.dumps(re_content)else:re_content = Noneself.data.update({'re_time': re_time,     # 请求时间're_url': request.path,     # 请求url're_method': re_method,     # 请求方法're_ip': re_ip,     # 请求IP're_content': re_content,    # 请求参数# 're_user': request.user.username    # 操作人(需修改),网站登录用户're_user': 'AnonymousUser'    # 匿名操作用户测试})def process_response(self, request, response):"""响应返回:param request: 请求对象:param response: 响应对象:return: response"""# 请求url在 exclude_urls中,直接return,不保存操作日志记录for url in self.__exclude_urls:if url in self.data.get('re_url'):return response# 获取响应数据字符串(多用于API, 返回JSON字符串)rp_content = response.content.decode()self.data['rp_content'] = rp_content# 耗时self.end_time = time.time()  # 响应时间access_time = self.end_time - self.start_timeself.data['access_time'] = round(access_time * 1000)  # 耗时毫秒/ms# 耗时大于3s的请求,单独记录 (可将时间阈值设置在settings中,实现可配置化)if self.data.get('access_time') > 3 * 1000:AccessTimeOutLogs.objects.create(**self.data)   # 超时操作日志入库dbOpLogs.objects.create(**self.data)  # 操作日志入库dbreturn response
  2. app01.models 数据库模型:

    from django.db import modelsclass OpLogs(models.Model):"""操作日志表"""id = models.AutoField(primary_key=True)re_time = models.CharField(max_length=32, verbose_name='请求时间')re_user = models.CharField(max_length=32, verbose_name='操作人')re_ip = models.CharField(max_length=32, verbose_name='请求IP')re_url = models.CharField(max_length=255, verbose_name='请求url')re_method = models.CharField(max_length=11, verbose_name='请求方法')re_content = models.TextField(null=True, verbose_name='请求参数')rp_content = models.TextField(null=True, verbose_name='响应参数')access_time = models.IntegerField(verbose_name='响应耗时/ms')class Meta:db_table = 'op_logs'class AccessTimeOutLogs(models.Model):"""超时操作日志表"""id = models.AutoField(primary_key=True)re_time = models.CharField(max_length=32, verbose_name='请求时间')re_user = models.CharField(max_length=32, verbose_name='操作人')re_ip = models.CharField(max_length=32, verbose_name='请求IP')re_url = models.CharField(max_length=255, verbose_name='请求url')re_method = models.CharField(max_length=11, verbose_name='请求方法')re_content = models.TextField(null=True, verbose_name='请求参数')rp_content = models.TextField(null=True, verbose_name='响应参数')access_time = models.IntegerField(verbose_name='响应耗时/ms')class Meta:db_table = 'access_timeout_logs'
    

Django中间件实现操作日志记录相关推荐

  1. JPOM - AOP+自定义注解实现操作日志记录

    文章目录 地址 版本 源码解析-AOP+自定义注解实现操作日志记录 地址 Gitee: https://gitee.com/dromara/Jpom 官网: https://jpom.io/ 一款简而 ...

  2. 共享服务器文件归档,如何实现共享文件访问记录方法、共享文件管理和共享文件操作日志记录.docx...

    文档 文档 PAGE / NUMPAGES 文档 如何实现共享文件访问记录方法.共享文件管理和共享文件操作日志记录 企业单位,办公都有应用到共享文件,经常会在文件共享服务器上存储单位一些重要的共享文件 ...

  3. qt 历史记录控件_基于Qt图形界面软件的操作日志记录方法及系统_2015106293015_说明书_专利查询_专利网_钻瓜专利网...

    技术领域 本发明涉及一种软件系统的日志记录技术,特别涉及一种基于Qt图形界面软件的操作日志记录方法及系统. 背景技术 软件操作日志是记录用户在使用软件的过程中,通过鼠标和键盘在操作界面上执行的点击和输 ...

  4. 如何实现操作操作日志记录

    如何实现操作操作日志记录 为什么要记录操作日志? 项目中的业务需求,需要针对用户的一些业务操作做操作记录, 也就是标题中的操场日志记录,最近做的项目也有这个需求, 我也是第一次写,相信有很多开发者也有 ...

  5. AOP实现操作日志记录

    一.设计: 操作日志记录 根据业务场景 一般是需要记录下数据修改更新的日志,查询类可以忽略. 所以需要对指定的某些方法进行记录.这块希望可以结合注解灵活操作,对于注解的方法进行日志记录 操作日志表设计 ...

  6. MySQL的操作日志记录

    如何配置mysql数据库的操作日志及如何查看mysql的操作日志记录 MySQL的几种操作日志 1.错误日志 log_error (主要是记录启动.运行.停止mysql时出现的致命问题,系统级别的错误 ...

  7. Django中间件与python日志模块 介绍

    一.Django中间件 1.1 介绍 Django中的中间件是一个轻量级.底层的插件系统,介于request与response处理之间的一道处理过程(用来处理特定业务的请求和响应).中间件的设计为开发 ...

  8. 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?

    来源:https://blog.csdn.net/yjt520557/article/details/85099115 | 简介 我在使用spring完成项目的时候需要完成记录日志,我开始以为Spri ...

  9. 自定义注解妙用,一行代码搞定用户操作日志记录

    1.简介 在使用spring完成项目的时候需要完成记录日志,开始以为Spring 的AOP功能,就可以轻松解决,半个小时都不用,可是经过一番了解过后,发现一般的日志记录,只能记录一些简单的操作,例如表 ...

最新文章

  1. openssl-1.0.1用mingw编译
  2. 【Linux】27.Markdown的用法
  3. oracle系统user$,Oracle 系统变量函数介绍
  4. 雷霆战机源代码c语言,C++实现雷霆战机可视化小游戏
  5. axios_json-server的介绍与服务器搭建---axios工作笔记002
  6. Android实现“是否退出”对话框和“带图标的列表”对话框
  7. 一篇关于原生 js 开发一款插件的前端教程
  8. 安卓手机密码工作原理及破解方式
  9. 解决apt-cyg命令不报错也无日志的小问题
  10. 使用WEX5移动开发工具制作仿淘宝APP
  11. 华为云弹性公网IP服务,为企业敲开互联网大门
  12. 动手学深度学习——链式法则、自动求导及实现
  13. HDOJ 2112 HDU Today (最短路 Dijkstra SPFA)
  14. unix 简单的命令
  15. Android 报错处理:All flavors must now belong to a named flavor dimension,Learn more at https://d.android
  16. Google招聘广告短片的启示
  17. 解决/var/lib/docker/overlay2占用很大、容器无法启动问题
  18. 018 Rust死灵书之非安全方式初始化内存
  19. 小明学会画几何图形了,他能根据要求,画出空心矩形。
  20. QUIC浅析,android开发者模式

热门文章

  1. Exposure Fusion
  2. lodash中数组删除常用的api
  3. 神垕古镇景区三方背后的博弈,争夺许昌第一家5A景区主导权
  4. 第七次 java实验 紫金学院 异常
  5. 搭建相亲源码,如何实现Nginx反向代理
  6. ajax请求时清除浏览器缓存,js清除浏览器缓存的几种方法
  7. 原创 | 在张小龙身上,我看到了「失控」的影子
  8. shell循环生成连续日期
  9. 阿里云峰会现场探班,“一云多芯”技术强在何处
  10. Python实现21点扑克牌游戏