# stream-record **Repository Path**: coding-easy/stream-record ## Basic Information - **Project Name**: stream-record - **Description**: 一个流式风格的记录器,它提供了如下能力: - 支持spel表达式和注解的方式进行方法调用记录 - 支持方法路由的方式进行方法调用记录 - 支持全局和局部记录数的统一处理 - 支持同步和异步的方法调用记录 - 对spring boot进行了无缝的集成 - 支持用户自定义扩展 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 3 - **Created**: 2021-03-25 - **Last Updated**: 2023-09-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 描述 在常规的日志收集往往采用的时直接在每个业务方法中进行标记收集,随着业务的增长和系统的复杂度升级往往这种方式会带来难以维护的成本以及难以扩展的问题,因此`stream record`出现了,它不仅仅能轻松的解决业务中的各种日志的收集包括但不仅限于(打印日志,审计日志,登陆日志等等),并且还有良好的扩展度以及简便的使用 方式 ## 功能列表 - 支持spel表达式和注解的方式进行方法调用记录 - 支持方法路由的方式进行方法调用记录 - 支持全局和局部记录数的统一处理 - 支持同步和异步的方法调用记录 - 对spring boot进行了无缝的集成 - 支持用户自定义扩展 ## 使用说明 ### 快速开始 **启动类** ```java @SpringBootApplication @EnableStreamRecord public class Application{ public static void main(String[] args) throws InterruptedException { SpringApplication.run(Application.class, args) } } ``` **定义全局记录生成器** ```java @Bean public RecordProducer producer(){ return new DefaultRecordProducer() { @Override public RecordInfoWrapper doProduce(CurrentContext currentContext) { System.out.println("调用自定义记录生成器") return super.doProduce(currentContext); } }; } ``` **定义全局记录管道** ```java @Bean public Pipeline pipeline(){ return auditLogInfoWrapper -> { //如果是多个结果 if (auditLogInfoWrapper.isMultiple()){ System.out.printf("管道中已有多个结果:%s" , JSONObject.toJSONString(auditLogInfoWrapper.getRecordInfos())); } //如果只有一个结果 else { System.out.printf("管道中已有多个结果:%s" , JSONObject.toJSONString(auditLogInfoWrapper.getRecordInfo())); } //对记录结果进行处理,如存到 db 或发到mq ... }; } ``` **在自己的业务方法上添加注解** ```java @Record("'这是一个简单的日志记录,用户的名称是:' + #user.name") @Override public void simple(@Search User user) { } ``` ### 配置说明 ```yaml stream: record: thread-poll-name: xxx #线程池名称,默认为 StreamRecordAutoConfiguration#executor enabled: true #激活开关,默认为开启 ``` ### 注解说明 #### `@RecordService` 说明:用于标记需要进行日志记录处理的类,如果在类上添加了`@RecordService`则不需要在添加`@Service` (日志记录处理的前提条件是必须满足类上添加`@RecordService`并且相应的方法上存在`@Record`) 属性: | 名称 | 默认值 | 说明 | | ------------- | ---------------- | ------------------------------------------------------------ | | value | "" | 用于标识spring bean的名称等价于'@Service(name='')' | | advice | 拦截方式 | 用于说明处理日志记录的时机,可选:BEFORE(方法政执行前),AFTER(方法执行后),AFTER_EXCEPTION(方法抛出异常后),EXCEPTION(方法异常时),NONE(没有意义)。优先级:小于方法级别 | | strategy | 记录的处理 策略 | 用于和`ProcessorStrategy#name`进行匹配,并获取到相应的`ProcessorStrategy#processor`对记录进行处理 ,默认实现有:expression,route。 优先级:小于方法级别 | | producerClass | 日志记录生成器 | 用于根据方法的运行时信息生成相应的日志记录,默认情况下从spring 容器中获取。优先级:小于方法级别 | | pipelineClass | 日志记录收集管道 | 用于收集producerClass生成的日志记录,默认情况下从spring 容器中获取。优先级:小于方法级别 | #### `@Record` 说明:用于标记需要进行日志记录的方法 属性: | 名称 | 默认值 | 说明 | | ------------- | ---------------- | ------------------------------------------------------- | | value | 无 | 日志记录内容模版 | | isAsync | true | 是异步进行收集 | | strategy | 记录的处理策略 | 作用和`RecordService#strategy`一样,只是优先级不同 | | producerClass | 日志记录生成器 | 作用和`RecordService#producerClass`一样,只是优先级不同 | | pipelineClass | 日志记录收集管道 | 作用和`RecordService#pipelineClass`一样,只是优先级不同 | | advice | 拦截方式 | 作用和`RecordService#advice`一样,只是优先级不同 | #### `@Param` 说明:用于将方法的参数映射到记录的上下文中 | 名称 | 默认值 | 说明 | | ----- | ------ | ---------- | | value | “” | 参数的名称 | #### `@Search` 说明:用于配合`@Param`一起使用,如果方法参数为嵌套对象,则用于指定需要进行搜索映射的嵌套对象中的参数(对于同一个属性`@Search`和`@Param`有且只有一个生效) #### `@RouteTarget` 说明:用于配合 `strategy=route`情况下使用,主要用于将处理记录的逻辑路由到用户自定义的方法中进行处理 | 名称 | 默认值 | 说明 | | ---------- | ------ | ------------------------------------------------------------ | | value | 无 | 目标类 | | paramTypes | [] | 方法参数 可选列表:InterceptMethodWrapper.class ,AttributeAccess.class | ### 插件说明 #### `ProcessorStrategy` 说明:处理策略,用于配合`RecordService#strategy`或者`Record#strategy`属性使用 #### `RecordPostProcessor` 说明:记录的后置处理器,用于在一次日志记录处理不同的生命周期阶段进行自定义扩展。该插件如在父子线程参数传递处理中就非常有用 #### `RecordProducer` 说明:日志记录生成器,如果bean的名称为`defaultRecordProducer`则会将该bean作为全局的日志记录生成器,且优先级小于类级别 #### `Pipeline` 说明:日志记录收集管道,如果bean名称为`defaultPipeline`则会将该bean作为全局的日志记录管道,且优先级小于类级别 #### `TemplateResolve` 说明:日志记录内容模版解析器 #### `ParamParse` 说明:参数解析器,用于对`@Param`,`@Search`进行解析 #### `ComponentFactory` 说明:组件工厂,主要用于创建`RecordProducer`,`Pipeline`,`RouteTarget#value`组件实例 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)