java用户行为日志记录方法_简单易用的开源用户操作日志记录系统
我们开发的业务系统通常会提供给很多人使用,那在使用的过程中,日志系统变得非常重要。
日志系统记录的用户行为有以下的作用:
从系统用户角度看:它展示了用户自身的操作历史和具体对象的变动历史,便于用户进行梳理
从系统管理员角度看:它可以记录了所有用户操作,便于我们定位异常行为
例如,在git的project操作中,我们就可以看到这样的操作日志展示:
对于这样的日志记录,我们可以在相关记录点添加对应的日志写入代码或者通过切面实现。然而,这样的日志展示是相对简单的,只是记录了操作行为的种类。而有时我们需要记录每个操作行为对操作对象引发的具体变动,例如展示出这样的结果:
这给日志记录带来了不小的挑战:
在一个系统中,可能涉及到多种对象(例如,学生、课程、老师),而每个对象的属性是完全不一样的
在一次操作中,可能改变了对象的一个或者多个属性,这也使得我们极难逐一记录
而今天,我们要介绍的是一套简单易用的对象日志记录系统,借助于它,我们可以方便地实现对象属性变动的记录与查询。
该系统来源于开源项目ObjectLogger,地址为 https://github.com/yeecode/ObjectLogger 。感兴趣的小伙伴可以前往Star该项目。
而ObjectLogger的核心引用了开源项目ObjectLoggerClient,地址为 https://github.com/yeecode/ObjectLoggerClient 可以一并Star。
最终实现的效果如下:
当然,该项目提供日志分析、记录、查询功能,前端页面的设计与展示交给使用者自己开发和优化,因此也保证了最大的自由度。接下来我们介绍该系统及其使用。
1 系统特点
该系统有着以下特点:
功能强大:部署完成后,可以支持日志的记录与查询,开发者只需再开发前端界面即可使用。
完全独立:该系统与业务系统完全独立,可插拔使用,不影响主业务流程。并且可以同时支持多个业务系统使用。
简单易用:系统采用SpringBoot实现,可以独立jar包启动。同时向业务系统提供jar包,便于日志的分析与写入。
自动解析:能自动解析被操作对象的零个、一个、多个属性变动,支持富文本对象的前后对比。
便于扩展:支持自定义对象变动说明、属性变动说明。支持更多对象属性类型的扩展
2 系统部署
2.1 数据库部分部署
自备数据库,mySql或者SQLserver数据库均可。
使用该项目的/database/init_data_table.sql文件初始化两个数据表。
2.2 ObjectLogger系统部署
下载github开源项目ObjectLogger的代码。
根据你的数据库种类、地址、密码等配置项目代码/src/main/resources/application.properties文件中的下面部分:
spring.datasource.driver-class-name ={db_driver}
spring.datasource.url =jdbc:mysql://{your_mysql_address}/{your_database_name}
spring.datasource.username ={your_database_username}
spring.datasource.password ={your_database_password}
使用maven打包该项目的jar包。
获取target目录下的jar包,使用java -jar ObjectLogger-1.0.1.jar启动项目。项目默认端口8080,可在配置文件中修改。
这样,我们已经可以查看到系统的启动页面,并可以通过/ObjectLogger/log/query查询系统中的日志,该接口支持传入参数对日志进行筛选过滤。不过,因为目前我们的系统刚刚搭建完成,应该没有任何的日志存入。
接下来我们便介绍如何配置业务系统,以便实现对象变化的分析与日志的写入。
2.3 业务系统配置
该部分主要讲解如何配置业务系统来实现将业务系统中的对象变化记录到ObjectLogger中。
2.3.1 业务系统添加maven依赖
在Pom中添加对ObjectLoggerClient jar包的引用。该jar包已经发布到了官方Maven仓库中,在Pom如下引用即可。
com.github.yeecode.objectLogger
ObjectLoggerClient
1.0.4
该依赖来源于项目ObjectLoggerClient。如果想了解详细原理可前去研究。
2.3.2 在业务系统中添加对ObjectLoggerClient中提供的bean的自动扫描
若业务应用为SpringBoot应用,则在SpringBoot的启动类前添加@ComponentScan注解,并在basePackages中增加ObjectLoggerClient的包地址:com.github.yeecode.objectLoggerClient,如:
若业务应用为Spring应用,则在applicationContext.xml增加对ObjectLoggerClient包地址的扫描:
2.3.3 添加对ObjectLoggerClient的配置
在application.properties中增加:
object.logger.add.log.api=http://{your_ObjectLogger_address}/ObjectLogger/log/add
object.logger.appName={your_app_name}
object.logger.add.log.api属性指向上一步的ObjectLogger的部署地址,用于将业务系统的日志发送到那里。
object.logger.appName指明了当前业务系统的应用名以便于区分日志来源,实现同时支持多个业务系统
2.3.4 声明一个扩展LocalTypeHandler的类,作为自由扩展的钩子
至此,整个系统部署结束。
3 系统使用
业务系统在任何需要进行日志记录的类中引入LogClient。例如:
@Autowired
private LogClient logClient;
接下来就可以自由使用了。
3.1 简单使用
直接将对象的零个、一个、多个属性变化放入actionItemModelList中发出即可。actionItemModelList置为null则表示此次对象无需要记录的属性变动。例如,业务应用中调用:
logClient.sendLogForItems("TaskModel",5,"actor name","addTask","add Task","via web page","some comments",null);
在ObjectLogger中使用如下查询条件:
http://{your_ObjectLogger_address}/ObjectLogger/log/query?appName=myBootApp&objectName=TaskModel&objectId=5
查询到日志:
3.2 对象变动自动记录
该功能可以自动完成新老对象的对比,并根据对比结果,将多个属性变动一起写入日志系统中。使用时,要确保传入的新老对象属于同一个类。
例如,业务系统这样调用:
则我们可以使用下面查询条件:
http://{your_ObjectLogger_address}/ObjectLogger/log/query?appName=myBootApp&objectName=TaskModel&objectId=9
查询到如下结果:
对象属性的自动对比需要@LogDescription注解的支持。对于对象中未加注解的属性会自动跳过对比。
例如,本次示例中的注解配置如下:
@LogDescription注解的属性介绍如下:
name:必填,对应写入日志后的attributeName值。
type:为AttributeTypeEnum的值,默认为AttributeTypeEnum.NORMAL。
AttributeTypeEnum.NORMAL:记录属性的新值和旧值,对比值为null
AttributeTypeEnum.TEXT: 用户富文本对比。记录属性值的新值和旧值,并将新旧值转化为纯文本后逐行对比差异,对比值中记录差异
AttributeTypeEnum.LOCALTYPE:表明该字段由用户自定义处理,此时localType生效。
localType:只有当type = AttributeTypeEnum.LOCALTYPE时生效。此时,该字段如果新旧值不一样,则会传递到LocalTypeHandler的实现类中。例如,示例中userId字段交由实现类处理,代码如下:
java用户行为日志记录方法_简单易用的开源用户操作日志记录系统相关推荐
- 简单易用的开源用户操作日志记录系统
我们开发的业务系统通常会提供给很多人使用,那在使用的过程中,日志系统变得非常重要. 日志系统记录的用户行为有以下的作用: 从系统用户角度看:它展示了用户自身的操作历史和具体对象的变动历史,便于用户进行 ...
- mysql操作日志记录查询_详解mysql数据库参数log_timestamps--控制日志记录使用的时区...
概述 最近发现之前安装的MySQL 5.7.27,其中的error log.general log日志里面日志时间的时区不对. 思路: mysql 5.7.2新增了参数 log_timestamps, ...
- qt 历史记录控件_基于Qt图形界面软件的操作日志记录方法及系统_2015106293015_说明书_专利查询_专利网_钻瓜专利网...
技术领域 本发明涉及一种软件系统的日志记录技术,特别涉及一种基于Qt图形界面软件的操作日志记录方法及系统. 背景技术 软件操作日志是记录用户在使用软件的过程中,通过鼠标和键盘在操作界面上执行的点击和输 ...
- php ci log,PHP框架CI CodeIgniter 的log_message开启日志记录方法
PHP框架CI CodeIgniter 的log_message开启日志记录方法 第一步:index.php文件,修改环境为开发环境 define('ENVIRONMENT', 'developmen ...
- 校园网无法登录IEEE(ieeexplore.ieee.org)问题的解决方法(简单易操作,不用改host文件)
校园网无法登录IEEE(ieeexplore.ieee.org)问题的解决方法(简单易操作,不用改host文件 不需要改变注册表或者运行代码的方法,简单易操作哦!(本人用的win11系统) 码字不易, ...
- 怎么给视频配音?短视频作者在用的三种方法,简单易操作
怎么给视频配音?短视频作者在用的三种方法,简单易操作 如果你也是做短视频的作者,那么相信你也一定知道,做短视频并不仅仅只是简单的拍摄剪辑发布而已,其中要做的工作还有很多,比如配音就是其中的一项.虽然并 ...
- 简单易用的开源ORM框架SqlSugar v5.0.0.19源码
介绍: SqlSugar是一款简单易用的开源ORM框架. 框架优点: 简单易用.功能齐全.高性能.轻量级.服务齐全 支持数据库:MySql.SqlServer.Sqlite.Oracle.postgr ...
- java通用日志记录_JAVA实现通用日志记录方法
前言: 之前想在filter层直接过滤httpServerletRequest请求进行日志处理,但是之后再getWriter()的 时候报already been call异常.查了下,才发现原来流形 ...
- 公布一个简单的日志记录方法 【转】-要研究
没有复杂的算法,也没有打算用log4net之类的东东.只要这个,就可以在目录的文件中,看到日志信息 一句话:简单实用. public static void Log(string message) ...
- 日志分类存放_博特智能|文本智能聚类——千万日志一览无余
对于海量文本型数据比如日志,如何从中提取日志模式以便更快地从文本中获取关键信息.本文先简单介绍了行业竞品的相关产品形态,然后重点介绍了一种基于机器学习的日志智能聚类解决方案--基于图结构的聚类方法. ...
最新文章
- 【C】——如何用线程进行参数的传递
- 80个招聘求职网站整理,不管招聘or求职,看这个就够了!
- Java 反射的理解
- Weblogic常见配置
- yolo标注的数据清洗
- CentOS 搭建内部Yum源同步阿里Yum源
- 中国商用密码SMS4
- java变量作用域Scope
- 艾特某人代码实现_Vue@某人,At某人,仿新浪微博@某人,@user,艾特,艾特某人...
- 解决输入框自动填充账号密码的问题
- 【数据库原理实验(openGauss)】完整性控制
- 【转】一次HBase问题的解决过程(Status: INCONSISTENT)
- 格拉布斯准则异常数据_异常处理准则和最佳实践
- Shiro框架-史上详解
- 如何去掉word文档右侧的竖线
- 干眼症久治不愈?反复发作,小心可能不是干眼症!
- 影响世界的100条管理名言
- ios11.2计算机更新,iOS11.2.2正式版怎么样、更新了什么?iOS11.2.2降频吗?
- Dashboard安装配置
- 地理信息科学专业转计算机,2019地理信息科学专业就业前景和就业方向分析
热门文章
- MATLB|电动汽车充放电的最优调度
- Unity Editor 编辑器扩展 九 Gizmos
- 分享5个Excel实用日常小技巧,不会的别说你会Excel!
- 项目管理工具二、STAR原则
- 华为锁屏后微信网络连接服务器,华为P30 Pro锁屏息屏状态下微信收不到信息,显示网络不可用...
- 国内外优秀的计算机视觉团队汇总
- PC-DARTS 网络结构搜索程序分析
- 使用通达信一次性获取沪深300成分股
- [吴恩达机器学习课程笔记] week four强化学习
- 纸张的规格A3.A4.A5.A6纸的尺寸大小