保存Web访问日志到数据库

Web项目可以通过log4j logback等技术实现保存访问日志到本地文件中,但是会在一些特殊的需求中会让我们保存用户访问日志到数据库中,此时我们可以通过拦截器来实现访问日志的保存。

目录

  • 保存Web访问日志到数据库

    • 目录
    • sys_event建表
    • 实体类SysEventEntity属性
    • SysEventService代码
    • 日志拦截器EventInterceptor
    • 设置SpringMVCxml 日志拦截器拦截路径
    • 日志流程图

日志系统列表 :

item desc
sys_event 数据库系统事件表
SysEventEntity 系统事件表实体类
SysEventMapper Dao层接口
SysEventService 系统事件Service
EventInterceptor 日志拦截器

1.sys_event建表

SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for sys_event
-- ----------------------------
DROP TABLE IF EXISTS `sys_event`;
CREATE TABLE `sys_event` (`id_` int(20) NOT NULL AUTO_INCREMENT,`title_` varchar(500) DEFAULT NULL,`request_uri` text,`parammeters_` varchar(500) DEFAULT NULL,`method_` varchar(200) DEFAULT NULL,`client_host` varchar(500) DEFAULT NULL,`user_agent` varchar(300) DEFAULT NULL,`status_` int(3) DEFAULT NULL,`enable_` tinyint(1) DEFAULT NULL,`remark_` text,`create_by` varchar(200) DEFAULT NULL,`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`update_by` varchar(200) DEFAULT NULL,`update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id_`)
) ENGINE=InnoDB AUTO_INCREMENT=343232 DEFAULT CHARSET=utf8;

2.实体类SysEventEntity属性:

    @Id@Column(name = "id_")private Integer id;@Column(name = "title_")private String title;@Column(name = "request_uri")private String requestUri;@Column(name = "parammeters_")private String parammeters;@Column(name = "method_")private String method;@Column(name = "client_host")private String clientHost;@Column(name = "user_agent")private String userAgent;@Column(name = "status_")private Integer status;@Column(name = "enable_")private Boolean enable;@Column(name = "create_by")private String createBy;@Column(name = "create_time")private Date createTime;@Column(name = "update_by")private String updateBy;@Column(name = "update_time")private Date updateTime;@Column(name = "remark_")private String remark;

3.SysEventService代码

使用线程池开启线程进行插入日志记录

@Service
public class SysEventService extends BaseService<SysEvent, Integer> {private ExecutorService executorService = Executors.newCachedThreadPool();public void saveEvent(final HttpServletRequest request, final HttpServletResponse response,final Exception ex, final Long startTime, final Long endTime) {final SysEvent record = new SysEvent();record.setMethod(request.getMethod());record.setRequestUri(request.getServletPath());record.setClientHost(WebUtil.getHost(request));record.setUserAgent(request.getHeader("user-agent"));record.setParammeters(JSON.toJSONString(request.getParameterMap()));
//      record.setCreateBy(SessionUtils.getLoginUser()!=null?SessionUtils.getLoginUser().getPhone():"匿名用户");record.setStatus(response.getStatus());final String msg = (String) request.getAttribute("msg");executorService.submit(new Runnable() {public void run() {try { // 保存操作if (StringUtils.isNotBlank(msg)) {record.setRemark(msg);} else {record.setRemark(ExceptionUtil.getStackTraceAsString(ex));}//插入一条记录insertSelective(record);// 内存信息if (logger.isDebugEnabled()) {String message = "开始时间: {}; 结束时间: {}; 耗时: {}s; URI: {}; ";// 最大内存: {}M; 已分配内存: {}M; 已分配内存中的剩余空间: {}M; 最大可用内存: {}M.// long total = Runtime.getRuntime().totalMemory() / 1024 / 1024;// long max = Runtime.getRuntime().maxMemory() / 1024 / 1024;// long free = Runtime.getRuntime().freeMemory() / 1024 / 1024;// , max, total, free, max - total + freelogger.debug(message, DateUtil.format(startTime, "HH:mm:ss.SSS"),DateUtil.format(endTime, "HH:mm:ss.SSS"),(endTime - startTime) / 1000.00, record.getRequestUri());}} catch (Exception e) {logger.error("Save event log cause error :", e);}}});}
}

4.日志拦截器EventInterceptor

public class EventInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate SysEventService sysEventService;private final ThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("ThreadLocal StartTime");public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 开始时间(该数据只有当前请求的线程可见)startTimeThreadLocal.set(System.currentTimeMillis());return super.preHandle(request, response, handler);}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 保存日志sysEventService.saveEvent(request, response, ex, startTimeThreadLocal.get(), System.currentTimeMillis());super.afterCompletion(request, response, handler, ex);}}

开始执行时:调用preHandle,此时通过ThreadLocal记录开始时间
方法执行结束后:调用afterCompletion,通过SysEventService添加一条日志记录

5.设置SpringMVC.xml 日志拦截器拦截路径

        <mvc:interceptor><mvc:mapping path="/**"/><!-- 静态资源不拦截 --><mvc:exclude-mapping path="/resources/**"/><bean class="com.qsb.commons.interceptor.EventInterceptor" /></mvc:interceptor>

日志流程图:

Created with Raphaël 2.1.0用户访问Web系统Spring-MVC判断日志拦截器是否拦截日志拦截器:EventInterceptorController访问结束yesno

日志管理系统之保存日志到数据库相关推荐

  1. linux下日志管理系统,Linux管理日志系统详解

    本文和大家探讨如何利用linux日志系统来管理系统.为方便阅读,在作者原文的基础上,有所修改. 对于日志信息的管理通常采用两种方法,一种方法是不同服务器的日志信息都存放在各自系统内,系统管理员对各服务 ...

  2. slf4j保存日志到数据库

    在开发工程中,我们通过slf4j进行日志的打印以及生成日志文件,每次对日志进行查询要么就是通过翻找控制台的打印结果或者文件,这样实在不方便. 通过将日志记录到数据库中,这样还能够在系统界面查看日志. ...

  3. 使用 Room 将数据保存到本地数据库学习日志+demo

    Android中使用 Room 并结合LiveData+ViewModel+RecyclerView将数据保存到本地数据库 Room理论学习 前期准备 导入库 Room三大组件之一:Entity Ro ...

  4. 怎样实现企业管理系统的操作日志功能

    怎样实现企业管理系统的操作日志功能 实现思路解析:在做企业管理系统的同一时候,操作日志这一功能是不可缺少的:所谓的操作日志就是记录一个用户从登陆时開始.到退出登陆时结束,记录这一过程中用户的所有操作: ...

  5. 开源服务器日志实时查看系统,开源日志管理系统

    开源日志管理系统 内容精选 换一换 鲲鹏工程师培训及认证为客户提供鲲鹏认证伙伴基于open系开源内核构建的商业软件培训,包含商业软件介绍.特性描述.操作使用.开发指导等内容. 来自:其他 MindX ...

  6. 清空数据库事务日志_通过事务日志增长加快数据库恢复和长期运行的事务

    清空数据库事务日志 In my previous article in this series Accelerated Database Recovery; Instant Rollback and ...

  7. Python+Django毕业设计中小型企业工作日志管理系统APP(程序+LW+部署)

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  8. ELK日志管理系统的搭建

    ELK日志管理系统的搭建 环境准备 Linux安装Elasticsearch 使用的 Elasticsearch的版本是7.6.2.Elasticsearch7.x要求 Linux内核必须是4+版本以 ...

  9. mysql查看数据库的日志文件_怎么查看mysql数据库的日志文件

    2017-10-16 回答 一.错误日志 错误日志在mysql数据库中很重要,它记录着mysqld启动和停止,以及服务器在运行过程中发生的任何错误的相关信息. 1.配置信息 --log-error=[ ...

  10. 基于javaweb+jsp的工作日志管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)

    基于javaweb+jsp的工作日志管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot) JavaWeb JavaBean JSP MVC ...

最新文章

  1. php禁止组合热键,cad组合快捷键命令有哪些
  2. 关于计算机专业的求职信英文怎么说,计算机求职信范文英文3篇
  3. 【原】WPF 主界面布局中DockPanel的停靠与默认填充
  4. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践
  5. python与网页设计的区别_Python与设计模式(三):行为型模式(上)
  6. 最大最小距离算法(K-MEANS K-medoids )聚类算法的结合运用
  7. JavaScript:JavaScript语法的详细介绍
  8. import keras的错误module ‘tensorflow.compat.v2‘ has no attribute ‘__internal__‘
  9. 【2】使用MATLAB进行机器学习(回归)
  10. WPF实例系列一:登录、注册界面设计
  11. 运放参数-快速了解输入偏置电流Ib和输入失调电流Ib_os参数-运算放大器
  12. mouse without borders 一套键鼠控制多台设备
  13. 为什么SEM竞价推广效果越来越差?
  14. Mysql数据库基础及高阶
  15. 20180423-B · Australian Salaries by Gender · ggplot2 ggalt geom_dumbbell 棒棒糖图 哑铃图 · R 语言数据可视化 案例 源码
  16. 一份不悔的爱情 魔兽中那些我们追过的橙色武器_马立杰_新浪博客
  17. MyBatis SSM
  18. linux传不上去文件,linux下上传文件,文件上传不上去
  19. 【PyTorch基础教程2】自动求导机制(学不会来打我啊)
  20. 利用python爬取复仇者联盟3无限战争豆瓣短评

热门文章

  1. ISO9000:2000 质量管理八大原则
  2. Windows映像劫持调试程序
  3. 电脑技巧 ADSL如何远程盗号
  4. 车载前视摄像头学习笔记 ———— 摄像头输出数据格式(RGB)
  5. 《无线电》杂志1955年到2000年高清扫描版,果断下载一份保存!
  6. 滚石杂志选出500张最强专辑
  7. mysql的 case用法_Mysql casewhen的三种用法
  8. 十大OpenGL教程
  9. BUMO 3.0原理以及设计.
  10. 项目配置管理工具研究