- Notifications
You must be signed in to change notification settings - Fork26
The auto log tool for java.(java 自动日志输出,基于字节码,兼容 spring)
License
houbb/auto-log
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
auto-log 是一款为 java 设计的自动日志监控框架。
经常会写一些工具,有时候手动加一些日志很麻烦,引入 spring 又过于大材小用。
所以希望从从简到繁实现一个工具,便于平时使用。
基于注解+字节码,配置灵活
自动适配常见的日志框架
支持编程式的调用
支持注解式,完美整合 spring
支持整合 spring-boot
支持慢日志阈值指定,耗时,入参,出参,异常信息等常见属性指定
支持 traceId 特性
支持类级别定义注解
支持自定义拦截器和过滤器
支持 spring aop 注解切面自定义
支持类似 dubbo filter 的拦截器链式调用
支持日志条件输出,支持日志自适应输出
支持日志的超长截断+丢弃策略,避免极端情况的性能问题
下面是一些日志、加解密、脱敏安全相关的库推荐:
| 项目 | 介绍 |
|---|---|
| sensitive-word | 高性能敏感词核心库 |
| sensitive-word-admin | 敏感词控台,前后端分离 |
| sensitive | 高性能日志脱敏组件 |
| auto-log | 统一日志切面组件,支持全链路traceId |
| encryption-local | 离线加密机组件 |
| encryption | 加密机标准API+本地客户端 |
| encryption-server | 加密机服务 |
V0.11.0 变更
- 支持日志的超长截断+丢弃策略,避免极端情况的性能问题
日志开源组件(一)java 注解结合 spring aop 实现自动输出日志
日志开源组件(二)java 注解结合 spring aop 实现日志traceId唯一标识
日志开源组件(三)java 注解结合 spring aop 自动输出日志新增拦截器与过滤器
日志开源组件(四)如何动态修改 spring aop 切面信息?让自动日志输出框架更好用
日志开源组件(五)如何将 dubbo filter 拦截器原理运用到日志拦截器中?
日志开源组件(六)Adaptive Sampling 自适应采样
高性能日志脱敏组件(一)java 日志脱敏框架 sensitive,优雅的打印脱敏日志
高性能日志脱敏组件(二)金融用户敏感数据如何优雅地实现脱敏?
高性能日志脱敏组件(三)日志脱敏之后,无法根据信息快速定位怎么办?
高性能日志脱敏组件(四)基于 log4j2 插件实现统一日志脱敏,性能远超正则替换
高性能日志脱敏组件(五)已支持 log4j2 和 logback 插件
<dependency> <group>com.github.houbb</group> <artifact>auto-log-core</artifact> <version>0.12.0</version></dependency>
UserServiceuserService =AutoLogHelper.proxy(newUserServiceImpl());userService.queryLog("1");
- 日志如下
信息: [TID=9d5ad747342e4f909d42001f1419c58b][METHOD=com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog:java.lang.String#查询日志][PARAM=["1"]][RESULT="result-1"][COST=607 ms]| 属性 | 说明 |
|---|---|
| TID | 日志跟踪号 |
| METHOD | 方法签名 |
| PARAM | 方法入参 |
| RESULT | 方法出参 |
| COST | 方法耗时 |
| SLOW-THRESHOLD | 慢日志阈值 |
| EXCEPTION | 方法异常 |
其中方法实现如下:
- UserService.java
publicinterfaceUserService {StringqueryLog(finalStringid);}
- UserServiceImpl.java
直接使用注解@AutoLog 指定需要打日志的方法即可。
publicclassUserServiceImplimplementsUserService {@Override@AutoLog(description ="查询日志",enableTraceId =true)publicStringqueryLog(Stringid) {return"result-"+id; }}
核心注解@AutoLog 的属性说明如下:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable | boolean | true | 是否启用 |
| param | boolean | true | 是否打印入参 |
| result | boolean | true | 是否打印出参 |
| costTime | boolean | false | 是否打印耗时 |
| exception | boolean | true | 是否打印异常 |
| slowThresholdMills | long | -1 | 当这个值大于等于 0 时,且耗时超过配置值,会输出慢日志 |
| description | string | "" | 方法描述,默认选择方法名称 |
| paramFilter | Class | WebParamFilter | 入参过滤器,支持自定义 |
| traceId | Class | Id.class | 日志跟踪号生成策略 |
| enableTraceId | boolean | true | 是否启用 traceId 的变化 |
使用建议,在入口的方法中设置enableTraceId=true,会统一设置 traceId,贯穿整个日志周期。 底层依赖的 service/biz 层等,设置为 false 即可。
AutoLogCommonFilter 默认日志增强实现
直接实现CommonFilter 类,并且实现对应的方法即可。
packagecom.github.houbb.auto.log.test.interceptor;importcom.github.houbb.auto.log.core.constant.AutoLogAttachmentKeyConst;importcom.github.houbb.common.filter.annotation.FilterActive;importcom.github.houbb.common.filter.api.CommonFilter;importcom.github.houbb.common.filter.api.Invocation;importcom.github.houbb.common.filter.api.Invoker;importcom.github.houbb.common.filter.api.Result;importcom.github.houbb.common.filter.exception.CommonFilterException;/** * 自定义日志拦截器 * @author binbin.hou * @since 0.0.12 */@FilterActive(order =1)publicclassMyAutoLogInterceptorimplementsCommonFilter {@OverridepublicResultinvoke(Invokerinvoker,Invocationinvocation)throwsCommonFilterException {finalStringtid = (String)invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_TRACE_ID);System.out.println("my test filter before " +tid);Resultresult =invoker.invoke(invocation);System.out.println("my test filter after " +tid);returnresult; }}
我们可以通过@FilterActive(order = 1) 指定拦截器执行的顺序,数值越小,越先执行。
invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_TRACE_ID) 可以获取 invocation 中传递的属性。
SPI 指定
创建文件resources\META-INF\services\com.github.houbb.common.filter.api.CommonFilter
在文件中指定我们定义的接口:
com.github.houbb.auto.log.test.interceptor.MyAutoLogInterceptormy test filter before 2bc181d4efb8408e948072022c9227c0my test filter after 2bc181d4efb8408e948072022c9227c0八月 06, 2023 8:13:19 下午 com.github.houbb.auto.log.core.support.interceptor.chain.AutoLogCommonFilter info信息: [TID=2bc181d4efb8408e948072022c9227c0][METHOD=com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog:java.lang.String#查询日志][PARAM=["1"]][RESULT="result-1"][COST=535 ms]WebParamFilter 主要用于过滤 HttpRequest HttpServlet 等无法直接 JSON 序列化的对象。
直接继承AbstractParamFilter 类实现对应的方法即可。
publicclassMyParamFilterextendsAbstractParamFilter {@OverrideprotectedObject[]doFilter(Object[]params) {Object[]newParams =newObject[1];newParams[0] ="设置我我想要的值";returnnewParams; }}
指定对应的参数过滤器。这样,无论入参是什么,都会变成我们指定的[设置我我想要的值]。
@AutoLog(paramFilter =MyParamFilter.class)publicStringparamFilter() {return"自定义入参过滤器";}
完整示例参考SpringServiceTest
<dependency> <groupId>com.github.houbb</groupId> <artifactId>auto-log-spring</artifactId> <version>0.12.0</version></dependency>
使用@EnableAutoLog 启用自动日志输出
@Configurable@ComponentScan(basePackages ="com.github.houbb.auto.log.test.service")@EnableAutoLogpublicclassSpringConfig {}
@ContextConfiguration(classes =SpringConfig.class)@RunWith(SpringJUnit4ClassRunner.class)publicclassSpringServiceTest {@AutowiredprivateUserServiceuserService;@TestpublicvoidqueryLogTest() {userService.queryLog("1"); }}
- 输出结果
信息: public java.lang.String com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog(java.lang.String) param is [1]五月 30, 2020 12:17:51 下午 com.github.houbb.auto.log.core.support.interceptor.AutoLogMethodInterceptor info信息: public java.lang.String com.github.houbb.auto.log.test.service.impl.UserServiceImpl.queryLog(java.lang.String) result is result-1五月 30, 2020 12:17:51 下午 org.springframework.context.support.GenericApplicationContext doClosespring aop 的切面读取自@Value("${auto.log.pointcut}"),默认为值@within(com.github.houbb.auto.log.annotation.AutoLog)||@annotation(com.github.houbb.auto.log.annotation.AutoLog)
也就是默认是读取被@AutoLog 指定的方法或者类。
当然,这并不够方便,我们希望可以想平时写 aop 注解一样,指定 spring aop 的扫描范围,直接在 spring 中指定一下auto.log.pointcut 的属性值即可。
我们在配置文件autoLogConfig.properties 中自定义下包扫描的范围:
auto.log.pointcut=execution(* com.github.houbb.auto.log.test.dynamic.service.MyAddressService.*(..))自定义测试 service
packagecom.github.houbb.auto.log.test.dynamic.service;importorg.springframework.stereotype.Service;@ServicepublicclassMyAddressService {publicStringqueryAddress(Stringid) {return"address-" +id; }}
自定义 spring 配置,指定我们定义的配置文件。springboot 啥的,可以直接放在 application.properties 中指定,此处仅作为演示。
@Configurable@ComponentScan(basePackages ="com.github.houbb.auto.log.test.dynamic.service")@EnableAutoLog@PropertySource("classpath:autoLogConfig.properties")publicclassSpringDynamicConfig {}
测试
@ContextConfiguration(classes =SpringDynamicConfig.class)@RunWith(SpringJUnit4ClassRunner.class)publicclassSpringDynamicServiceTest {@AutowiredprivateMyAddressServicemyAddressService;@AutowiredprivateMyUserServicemyUserService;@TestpublicvoidqueryUserTest() {// 不会被日志拦截myUserService.queryUser("1"); }@TestpublicvoidqueryAddressTest() {// 会被日志拦截myAddressService.queryAddress("1"); }}
<dependency> <groupId>com.github.houbb</groupId> <artifactId>auto-log-springboot-starter</artifactId> <version>0.12.0</version></dependency>
只需要引入 jar 即可,其他的什么都不用配置。
使用方式和 spring 一致。
@AutowiredprivateUserServiceuserService;@TestpublicvoidqueryLogTest() {userService.query("spring-boot");}
distributed trace
全局配置 比如全局的慢日志阈值设置等 参考 sandglass 中如何加载注解中的配置信息?(基于配置文件)
比例采样策略
自适应采样策略
改进 interceptor 拦截器,类似 dubbo filter
优化日志中的方法路径名称
编译时注解特性 类似 aspectj
基于 agent 特性,类似 sky-walking
- 流程
日志/trace 信息的生成
采集
存储
检索/分析
可视化
| 编号 | 名称 | 简介 | 标签 |
|---|---|---|---|
| 1 | sensitive | 基于注解的日志脱敏框架,更加优雅的日志打印 | 工具,日志 |
| 2 | auto-log | 日志自动输出 | 工具,日志 |
| 3 | heaven | 收集开发中常用的工具类 | 工具 |
| 4 | resubmit | 防止重复提交框架 | 工具 |
| 5 | validator | 新一代校验框架 | 工具 |
| 6 | rate-limit | 渐进式限流工具框架 | 工具 |
| 7 | lock | 开箱即用分布式锁 | 工具 |
| 8 | lombok-ex | 编译时注解框架,扩展 lombok | 工具 |
| 9 | csv | CSV的读写工具 | 工具 |
| 10 | iexcel | EXCEL的读写工具,避免OOM | 工具 |
| 11 | leetcode | 力扣算法个人学习笔记 | 学习 |
| 12 | awesome-metaverse-zh | 元宇宙精选 | 学习 |
| 13 | rpc | 手写rpc框架 | 学习,中间件 |
| 14 | mybatis | 手写mybatis框架 | 学习,中间件 |
| 15 | cache | 手写redis框架 | 学习,中间件 |
| 16 | mq | 手写mq框架 | 学习,中间件 |
| 17 | ioc | 手写spring ioc框架 | 学习,中间件 |
| 18 | async | 手写线程池异步框架 | 学习,中间件 |
| 19 | jdbc-pool | 手写数据库连接池实现 | 学习,中间件 |
| 20 | sisyphus | 支持注解的重试框架 | 学习,中间件 |
| 21 | sandglass | 任务调度时间框架 | 学习,中间件 |
| 22 | segment | 基于结巴的分词实现 | NLP |
| 23 | pinyin | 高性能中文转拼音工具 | NLP |
| 24 | opencc4j | 中文繁简体转换 | NLP |
| 25 | word-checker | 中英文拼写检测 | NLP |
| 26 | sensitive-word | 敏感词 | NLP |
| 27 | nlp-hanzi-similar | 汉字相似度 | NLP |
| 28 | word-cloud | 好用的词云工具 | DOC |
| 29 | markdown-toc | 为文档生成目录 | DOC |
| 30 | idoc | 项目自动生成文档 | DOC |
| 31 | metadata | 数据库元数据表文档生成 | DOC |
| 32 | data-factory | 测试自动生成对象信息 | TEST |
| 33 | junitperf | 性能测试框架,测试报告生成 | TEST |
| 34 | houbb.github.io | 个人博客 | 学习 |
About
The auto log tool for java.(java 自动日志输出,基于字节码,兼容 spring)
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.