日记一句话简短,可以写入日记的句子

推荐人:网络投稿 来源: 网络资源 时间: 2022-06-28 18:30 阅读:
日记一句话简短,可以写入日记的句子

本文目录:

定义:操作日志主要是指对某个对象进行新增操作或者修改操作后记录下这个新增或者修改,操作日志要求可读性比较强,因为它主要是给用户看的,比如订单的物流信息,用户需要知道在什么时间发生了什么事情。再比如,客服对工单的处理记录信息。

以我们系统内部使用的一个CRM系统举例,里面每个联系人的资料都会有操作历史:

这些数据就是操作系统日志,这些数据通常会以结构化数据的形式存储在数据库中,对于开发来说,这种日志的代码逻辑通常是非常规律,比如读取变化前和变化后的数据,获取当前操作人和操作时间等等。

在小型项目中,这种日志记录的操作通常会以提供一个接口或整个日志记录Service来实现。那么放到多人共同开发的项目中,除了封装一个方法,还有什么更好的办法来统一实现操作日志的记录?下面就要讨论下在Java中,常见的操作日志实现方式。

当你需要给一个大型系统从头到尾加上操作日志,那么除了上述的手动处理方式,也有很多种整体设计方案:

Canal应运而生,它通过伪装成数据库的从库,读取主库发来的binlog,用来实现数据库增量订阅和消费业务需求。可以看我的这篇文章:

阿里开源MySQL中间件Canal快速入门

这个方式有点是和业务逻辑完全分离,缺点也很大,需要使用到MySQL的Binlog,向DBA申请就有点困难。如果涉及到修改第三方接口,那么就无法监听别人的数据库了。所以调用RPC接口时,就需要额外的在业务代码中增加记录代码,破坏了“和业务逻辑完全分离”这个基本原则,局限性大。

美团的原文给出了注解记录日志的详细架构设计方案,并且贴出了部分源码。但是文中并没有完整的开源项目,由于自己也很感兴趣,并且公司的业务正好也有类似需求,所以我花了点时间,实现了一版最简易的版本,支持将操作日志传递到消息队列中。

大楼不是一天建成的,美团博客中描述的方案应该在公司内部已经非常成熟了,我也没有那么多精力一口气吃成一个胖子,我们从最基础的版本写起。

我给自己的这个项目,或者说依赖包起名为log-record-starter,一方面遵循springboot-starter命名规范,一方面也表明项目的用处,记录日志。

Q:你这个依赖包,又是一个冗余的造轮子吧?市面上这种东西是不是已经够多了?

Q:我用了你这个依赖包,是不是很复杂?之后你不维护了的话,是不是坑我们这些吃螃蟹的?

A:依赖包的维护问题一直是一个大问题,本着最小依赖,尽量可扩展的原则。本库特点如下:

好了,这就是我想说在前面的话。下面就是该项目的使用介绍和应用场景介绍。

本项目支持用户使用注解的方式从方法中获取操作日志,并推送到指定数据源

第一步: SpringBoot项目中引入依赖

<dependency\n <groupIdcn.monitor4all</groupId\n <artifactIdlog-record-starter</artifactId\n <version1.0.0</version\n</dependency\n

这里先打断一下,由于Maven公共仓库,是全球唯一托管的,个人开发的项目要提交上去,需要复杂的审核流程,我搞了一会没搞定,就先将包传到了Github Package上(实际就是Github的私有Maven库),所以大家引入依赖后,是不会直接拉到包的,需要配置下你的Maven settings.xml文件。(之后我肯定想办法发到公共仓库,呜呜呜~)

配置很简单,两步,一步是去Github登录,到自己的Settings中,申请一个token,拿到一串字符串。

第二步,找到你的settings.xml文件,添加上:

https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry

重启下你的IDEA,能看到下面这个,应该你的settings.xml生效了。

目前我的版本号是1.0.0,之后会更新,未来最新版本号在我仓库查询:

https://github.com/qqxx6661/logRecord

第二步: 在Spring配置文件中添加rabbitmq数据源配置

在自己公司里由于阿里封装了自己的MQ叫做MetaQ,并没有对外开源,所以这里先接入了RabbitMQ,也算是比较通用,图个方便。未来会接其他数据源。RabbitMq的安装在这里不展开了,实在是不想把篇幅拉得太大,大家可以自行谷歌下,比如“Docker安装RabbitMq”类似的文章,几分钟就可以设置安装好。

log-record.rabbitmq.host=localhost\nlog-record.rabbitmq.port=5672\nlog-record.rabbitmq.username=admin\nlog-record.rabbitmq.password=xxxxxxxx\nlog-record.rabbitmq.queue-name=logrecord\nlog-record.rabbitmq.routing-key=\nlog-record.rabbitmq.exchange-name=logrecord\n

第三步: 在你自己的项目中,在需要记录日志的方法上,添加注解。

该注解通过在切面中解析SpEL参数(啥事SpEL?快去谷歌下,之后要讲),将数据发往数据源。目前仅支持RabbitMq,发送的消息体如下:

方法处理正常发送消息体:

项目具体的实现原理和细节,放在下一篇文章详细讲。(肯定会填坑)

以下罗列了一些实际的应用场景,包括我业务中实际使用,并且已经上线使用的场景。

二、特定操作触发通知:由于我的业务是接手了好几个仓库,并且这几个仓库的操作串成了一条完成链路,我需要在链路的某个节点触发给用户的提醒,如果写硬编码也可以实现,但是远不如在方法上使用注解发送消息来得方便。例如下方在下单方法调用后发送消息。

三、特定操作更新数据表:我的业务中,几个系统互相吞吐数据,订单的一部分数据存留在外部系统里,我们最终目标想要将其中一个系统替代掉,所以需要拦截他们的数据,恰好几个系统是使用LINK作为网关的,我们将数据请求拦截一层,并将拦截的方法使用该二方库进行全部参数的发送,将数据同步写入我们自己的数据库中,实现”双写“。

四、跨多应用数据聚合操作:和”三“类似,在多个应用中,如果需要做行为相同的业务逻辑,完全可以在各个系统中将数据发送到同一个消息队列中,再进行统一处理。

最后,肯定有小伙伴希望有一个完整的使用Demo,这就奉上!

完整Demo项目:

https://github.com/qqxx6661/systemLog

log-record-starter:

https://github.com/qqxx6661/logRecord

[db:繁体内容]

赞助推荐