Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

The auto log tool for java.(java 自动日志输出,基于字节码,兼容 spring)

License

NotificationsYou must be signed in to change notification settings

houbb/auto-log

Repository files navigation

auto-log 是一款为 java 设计的自动日志监控框架。

Build StatusMaven CentralOpen Source Love

创作目的

经常会写一些工具,有时候手动加一些日志很麻烦,引入 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 插件

快速开始

maven 引入

<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

核心注解@AutoLog 的属性说明如下:

属性类型默认值说明
enablebooleantrue是否启用
parambooleantrue是否打印入参
resultbooleantrue是否打印出参
costTimebooleanfalse是否打印耗时
exceptionbooleantrue是否打印异常
slowThresholdMillslong-1当这个值大于等于 0 时,且耗时超过配置值,会输出慢日志
descriptionstring""方法描述,默认选择方法名称
paramFilterClassWebParamFilter入参过滤器,支持自定义
traceIdClassId.class日志跟踪号生成策略
enableTraceIdbooleantrue是否启用 traceId 的变化

使用建议,在入口的方法中设置enableTraceId=true,会统一设置 traceId,贯穿整个日志周期。 底层依赖的 service/biz 层等,设置为 false 即可。

自定义策略

自定义日志拦截器(interceptor)

内置拦截器

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.MyAutoLogInterceptor

测试效果

my 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]

自定义入参过滤器(paramFilter)

内置

WebParamFilter 主要用于过滤 HttpRequest HttpServlet 等无法直接 JSON 序列化的对象。

自定义

直接继承AbstractParamFilter 类实现对应的方法即可。

publicclassMyParamFilterextendsAbstractParamFilter {@OverrideprotectedObject[]doFilter(Object[]params) {Object[]newParams =newObject[1];newParams[0] ="设置我我想要的值";returnnewParams;    }}

使用

指定对应的参数过滤器。这样,无论入参是什么,都会变成我们指定的[设置我我想要的值]

@AutoLog(paramFilter =MyParamFilter.class)publicStringparamFilter() {return"自定义入参过滤器";}

spring 整合使用

完整示例参考SpringServiceTest

maven 引入

<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 doClose

切面自定义

原理解释

spring 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");    }}

springboot 整合使用

maven 引入

<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");}

开源地址

Github:https://github.com/houbb/auto-log

Gitee:https://gitee.com/houbinbin/auto-log

Road-Map

  • distributed trace

  • 全局配置 比如全局的慢日志阈值设置等 参考 sandglass 中如何加载注解中的配置信息?(基于配置文件)

  • 比例采样策略

  • 自适应采样策略

  • 改进 interceptor 拦截器,类似 dubbo filter

  • 优化日志中的方法路径名称

  • 编译时注解特性 类似 aspectj

  • 基于 agent 特性,类似 sky-walking


  • 流程

日志/trace 信息的生成

采集

存储

检索/分析

可视化

开源矩阵

编号名称简介标签
1sensitive基于注解的日志脱敏框架,更加优雅的日志打印工具,日志
2auto-log日志自动输出工具,日志
3heaven收集开发中常用的工具类工具
4resubmit防止重复提交框架工具
5validator新一代校验框架工具
6rate-limit渐进式限流工具框架工具
7lock开箱即用分布式锁工具
8lombok-ex编译时注解框架,扩展 lombok工具
9csvCSV的读写工具工具
10iexcelEXCEL的读写工具,避免OOM工具
11leetcode力扣算法个人学习笔记学习
12awesome-metaverse-zh元宇宙精选学习
13rpc手写rpc框架学习,中间件
14mybatis手写mybatis框架学习,中间件
15cache手写redis框架学习,中间件
16mq手写mq框架学习,中间件
17ioc手写spring ioc框架学习,中间件
18async手写线程池异步框架学习,中间件
19jdbc-pool手写数据库连接池实现学习,中间件
20sisyphus支持注解的重试框架学习,中间件
21sandglass任务调度时间框架学习,中间件
22segment基于结巴的分词实现NLP
23pinyin高性能中文转拼音工具NLP
24opencc4j中文繁简体转换NLP
25word-checker中英文拼写检测NLP
26sensitive-word敏感词NLP
27nlp-hanzi-similar汉字相似度NLP
28word-cloud好用的词云工具DOC
29markdown-toc为文档生成目录DOC
30idoc项目自动生成文档DOC
31metadata数据库元数据表文档生成DOC
32data-factory测试自动生成对象信息TEST
33junitperf性能测试框架,测试报告生成TEST
34houbb.github.io个人博客学习

About

The auto log tool for java.(java 自动日志输出,基于字节码,兼容 spring)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors2

  •  
  •  

[8]ページ先頭

©2009-2025 Movatter.jp