☰
Current Page
Main Menu
Home
Home
Editing
操作日志app设计与实现
Edit
Preview
h1
h2
h3
default
Set your preferred keybinding
default
vim
emacs
markdown
Set this page's format to
AsciiDoc
Creole
Markdown
MediaWiki
Org-mode
Plain Text
RDoc
Textile
Rendering unavailable for
BibTeX
Pod
reStructuredText
Help 1
Help 1
Help 1
Help 2
Help 3
Help 4
Help 5
Help 6
Help 7
Help 8
Autosaved text is available. Click the button to restore it.
Restore Text
## 版本管理 ## <font color=green>v3.0.0-RELEASE</font> ### change log - 兼容 elastic search 存储操作日志 - 新增白名单通配符配置* ### elasticsearch存储演示 <video width="100%" height="100%" src="http://192.168.175.198:10003/iidpminio/operator-log/%E6%93%8D%E4%BD%9C%E6%97%A5%E5%BF%97app-v3.0.0-%E5%85%BC%E5%AE%B9es%E5%AD%98%E5%82%A8.mp4" controls="true" /> ### 通配符配置 [[http://iidp.chinasie.com:9999/iidpminio/operator-log/wildcard.jpg]] 如上图所示,app是必选,model和service可以配置为通配符*,配置通配符后即可将指定app下的所有model或者指定model下的所有service加入操作日志跟踪白名单。 <hr> ## 操作日志设计与实现 为了方便开发人员定位线上的问题,设计并实现了这个操作日志app,具体需求参考: http://192.168.175.55:9888/appDev/sie-nest-log/issues/1 该需求目前分为两期,第一期是只实现了rpc层面的请求参数和返回结果的记录, 第二期实现了rpc请求过程中涉及到的各个方法调用的详情,包括方法执行前参数、 调用后的结果数据、请求速率限制、请求黑白名单配置等功能。 ### 设计 - 日志功能需求 由 http://192.168.175.55:9888/appDev/sie-nest-log/issues/1 需求可知, 需要记录rpc请求参数、执行过程详情和返回结果等需求。 - 性能需求 由于日志是非常频繁的,为了尽量影响用户的rpc请求,需要异步执行存储日志,防止大量日志影响用户的请求。 目前使用异步队列,日志生成后放入队列,消费方在独立的线程中批处理或者定时处理日志并存储。 - 黑名单需求 为了过滤掉一些非常频繁的rpc请求,需要对这些频繁的请求进行日志数据的限制, 同时为了保活用户要求的rpc方法防止因频率过高而被放置到黑名单,因为提供了黑白名单的功能,黑名单的方法不会保存日志,白名单的方法一定会保存日志。 ### 实现 - ###### 日志功能 1. 引擎部分 [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image.png]] [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image1.png]] 如上图所示,主要在rpc的入口和finally出口进行数据采集并写入日志队列。 另外,需要采集rpc请求过程中的详情,那么就需要在 bussModelDataAccess create/update/delete 三个方法中记录相关日志 [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image2.png]] [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image3.png]] [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image4.png]] 可以发现在执行多个操作方法时,是按照执行的顺序,依次追加进context中的operatorData中的, 这个追加顺序就是链路的顺序。 2. app部分 app源码仓库参考:http://192.168.175.55:9888/appDev/sie-nest-log 首先在app中定义了三个模型,分别是:操作日志模型、日志详情模型和黑白名单模型 这三个模型对应这两张数据库表,保存对应的数据内容。其中操作日志和日志详情表,是通过操作日志表的主键去关联日志详情表, 也就是说,一条操作日志可能会关联多条日志详情记录,日志详情记录了该操作日志操作过程中的create/update/delete前后的数据,由于在追加的时候已经维护了操作顺序,那么就可以通过生成spanID来在表中维护它们之间的顺序。 可参考下图所示代码: [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image5.png]] - ###### 性能 1. 异步阻塞队列 考虑到写入日志的性能,维护了一个异步阻塞队列 ```ArrayBlockingQueue<Map<String, Object>> queue = new ArrayBlockingQueue<>(5000);``` 任何日志产生后都写入该队列,独立线程进行阻塞消费该队列,触发消费行为由两个方面触发,一个是日志已经满200条,另一个是超时时间10s. [[http://iidp.chinasie.com:9999/iidpminio/operator-log/image6.png]] - ###### 黑白名单 黑白名单是为了让用户配置哪些方法需要记录日志,哪些方法不需要记录日志。 此外,该日志app还会自动检测哪些方法的打印日志频率超过了给定的阈值,也会自动加入到黑名单,但是如果该方法已经配置了白名单, 那么不会再加入白名单了。简单来说判断顺序是:```白名单 > app自动检测 > 黑名单``` 另外,考虑到查询黑白名单的性能,做了进程内缓存,会将使用到的黑白名单缓存在本地内存,并设置缓存的过期时间,也会定时扫描清楚过期的缓存 由于本地缓存与数据库的数据一致性,所以会存在一定的延迟,但最终是一致的。 [[http://iidp.chinasie.com:9999/iidpminio/operator-log/data.png]] ### web页面效果 [[http://iidp.chinasie.com:9999/iidpminio/operator-log/web.png]]
Uploading file...
Sidebar
[[_TOC_]]
Edit message:
Cancel