我们开发的业务系统通常会提供给很多人使用,那在使用的过程中,日志系统变得非常重要。

日志系统记录的用户行为有以下的作用:

  • 从系统用户角度看:它展示了用户自身的操作历史和具体对象的变动历史,便于用户进行梳理
  • 从系统管理员角度看:它可以记录了所有用户操作,便于我们定位异常行为

例如,在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系统部署

  1. 下载github开源项目ObjectLogger的代码。
  2. 根据你的数据库种类、地址、密码等配置项目代码/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}
  1. 使用maven打包该项目的jar包。
  2. 获取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如下引用即可。

<dependency><groupId>com.github.yeecode.objectLogger</groupId><artifactId>ObjectLoggerClient</artifactId><version>1.0.4</version>
</dependency>

该依赖来源于项目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字段交由实现类处理,代码如下:

简单易用的开源用户操作日志记录系统相关推荐

  1. mysql中用户操作日志_Mysql 纪录用户操作日志

    我们想追踪某个数据库操作记录,如想找出是谁操作了某个表(比如谁将字段名改了). 二进制日志记录了操作记录,线程号等信息,但是却没有记录用户信息,因此需要结合init-connect来实现追踪. ini ...

  2. Spring Boot + Aop 记录用户操作日志

    目录 一.前言 二.实战 1.设计用户操作日志表: sys_oper_log 2.引入依赖 3.自定义用户操作日志注解 4.自定义用户操作日志切面 5.MyLog注解的使用 6.最终效果 三.总结 一 ...

  3. 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录

    前言: 任何一个项目都会有一个用户操作日志(也叫行为日志)的模块,它主要用来记录某个用户做了某个操作,当出现操作失败时,通过日志就可以快速的查找是哪个用户在哪个模块出现了错误,以便于开发人员快速定位问 ...

  4. 简单易用的开源ORM框架SqlSugar v5.0.0.19源码

    介绍: SqlSugar是一款简单易用的开源ORM框架. 框架优点: 简单易用.功能齐全.高性能.轻量级.服务齐全 支持数据库:MySql.SqlServer.Sqlite.Oracle.postgr ...

  5. ssm 项目记录用户操作日志和异常日志

    ssm 项目记录用户操作日志和异常日志 参考文章: (1)ssm 项目记录用户操作日志和异常日志 (2)https://www.cnblogs.com/mei-m/p/10231792.html (3 ...

  6. IP记录Linux所有用户操作日志的方法(附脚本)

    按时按登录IP记录Linux所有用户操作日志的方法(附脚本) 标签: IP记录,Linux,总结,按时,方法,日志,用户操作,脚本.PS:Linux用户操作记录一般通过命令history来查看历史记录 ...

  7. 使用Spring AOP自定义注解方式实现用户操作日志记录

    1,开发环境 操作系统:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定义注解类UserLog @Target({ElementT ...

  8. Linux记录用户操作日志

    前言 我这里计划用SLS做服务器日志审计,安装Logtail后通过 [分隔符-文本] 的方式,采集服务器各种相关日志,大概需要以下内容(目录可能是错的,这个是做等保的评测的兄弟发过来的) /var/l ...

  9. Ubuntu16.04查看用户操作日志

    Ubuntu16.04查看用户操作日志 查看用户登录日志 last // 查看最近登录的账户的信息 lastlog // 查看所有账户的最近一次登录信息 查看用户的操作记录 : 到用户家目录下查看.b ...

最新文章

  1. Silverlight学习笔记之使用TranslateTransform控制对象位置
  2. 宿主机訪问virtualBox中Ubuntu
  3. java实现插入排序
  4. 在组件之间实现事务和异步提交事务(NET2.0)
  5. python机械手标定_机械手姿态的获取,ros,臂,当前,位姿
  6. React之props基本使用
  7. redis rdb aof区别_理解Redis的持久化机制:RDB和AOF
  8. 前沿 | 美国白宫AI峰会闭幕:特朗普政府5大措施加速布局AI生态
  9. Android:JNI 与 NDK的区别(含实例教学)
  10. 交换最小值和最大值 (15 分)
  11. 从源码分析RocketMQ系列-Remoting通信架构源码详解
  12. 与其纠结,不如放弃!
  13. 【AppScan闪退】
  14. VS2017 Ankhsvn不可用
  15. 数字图像处理基础知-色度空间(RGB\CMY\CMYK\HSI的详细解释和一些关联性描述)
  16. 分布式资源管理与任务调度框架Yarn
  17. 提交代码遇到的问题remote: Support for password authentication was removed on August 13, 2021.
  18. 广州大学机器学习与数据挖掘实验二
  19. Python+大数据-数据处理与分析-pandas快速入门
  20. 2021-2025年中国智能电源插座行业市场供需与战略研究报告

热门文章

  1. WGS1984与ITRF框架
  2. pat-A1027-Colors in Mars
  3. 分布式文件存储系统技术及实现
  4. 从零开始搭建自己的LNMP环境
  5. 基于51单片机的智能宠物喂食系统
  6. 链表之节点插入、删除节点、遍历打印、遍历释放,static 全局变量
  7. oracle强弱动态游标,Oracle动态游标的使用
  8. 多层Unity3D物体模型穿透问题处理
  9. 编程英语:常见代码错误 error 语句学习(5)
  10. 下载并且添加头文件<conio.h>