Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/houbb/auto-log
The auto log tool for java.(java 自动日志输出,基于字节码,兼容 spring)
https://github.com/houbb/auto-log
asm auto-logging autolog autologger awesome awesome-java log logging monitor spring spring-boot traceid
Last synced: 3 months ago
JSON representation
The auto log tool for java.(java 自动日志输出,基于字节码,兼容 spring)
- Host: GitHub
- URL: https://github.com/houbb/auto-log
- Owner: houbb
- License: apache-2.0
- Created: 2020-05-28T13:06:39.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-03-23T03:53:25.000Z (9 months ago)
- Last Synced: 2024-09-25T12:04:05.318Z (3 months ago)
- Topics: asm, auto-logging, autolog, autologger, awesome, awesome-java, log, logging, monitor, spring, spring-boot, traceid
- Language: Java
- Homepage:
- Size: 368 KB
- Stars: 48
- Watchers: 4
- Forks: 26
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# auto-log
[auto-log](https://github.com/houbb/auto-log) 是一款为 java 设计的自动日志监控框架。
[![Build Status](https://travis-ci.com/houbb/auto-log.svg?branch=master)](https://travis-ci.com/houbb/auto-log)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.houbb/auto-log/badge.svg)](http://mvnrepository.com/artifact/com.github.houbb/auto-log)
[![](https://img.shields.io/badge/license-Apache2-FF0080.svg)](https://github.com/houbb/auto-log/blob/master/LICENSE.txt)
[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/houbb/auto-log)## 创作目的
经常会写一些工具,有时候手动加一些日志很麻烦,引入 spring 又过于大材小用。
所以希望从从简到繁实现一个工具,便于平时使用。
## 特性
- 基于注解+字节码,配置灵活
- 自动适配常见的日志框架
- 支持编程式的调用
- 支持注解式,完美整合 spring
- 支持整合 spring-boot
- 支持慢日志阈值指定,耗时,入参,出参,异常信息等常见属性指定
- 支持 traceId 特性
- 支持类级别定义注解
- 支持自定义拦截器和过滤器
- 支持 spring aop 注解切面自定义
- 支持类似 dubbo filter 的拦截器链式调用
- 支持日志条件输出,支持日志自适应输出
- 支持日志的超长截断+丢弃策略,避免极端情况的性能问题
## 变更日志
> [变更日志](https://github.com/houbb/auto-log/blob/master/CHANGELOG.md)
V0.11.0 变更
- 支持日志的超长截断+丢弃策略,避免极端情况的性能问题
## 拓展阅读
[日志开源组件(一)java 注解结合 spring aop 实现自动输出日志](https://houbb.github.io/2023/08/06/auto-log-01-overview)
[日志开源组件(二)java 注解结合 spring aop 实现日志traceId唯一标识](https://houbb.github.io/2023/08/06/auto-log-02-trace-id)
[日志开源组件(三)java 注解结合 spring aop 自动输出日志新增拦截器与过滤器](https://houbb.github.io/2023/08/06/auto-log-03-filter)
[日志开源组件(四)如何动态修改 spring aop 切面信息?让自动日志输出框架更好用](https://houbb.github.io/2023/08/06/auto-log-04-dynamic-aop)
[日志开源组件(五)如何将 dubbo filter 拦截器原理运用到日志拦截器中?](https://houbb.github.io/2023/08/06/auto-log-05-dubbo-interceptor)
[日志开源组件(六)Adaptive Sampling 自适应采样](https://mp.weixin.qq.com/s/9JH3WfR6Y474LCbY2mZxZQ)
[高性能日志脱敏组件(一)java 日志脱敏框架 sensitive,优雅的打印脱敏日志](https://mp.weixin.qq.com/s/xzQNDF7s705iurk7N0uheQ)
[高性能日志脱敏组件(二)金融用户敏感数据如何优雅地实现脱敏?](https://mp.weixin.qq.com/s/ljChFiNLzV6GLaUDjehA0Q)
[高性能日志脱敏组件(三)日志脱敏之后,无法根据信息快速定位怎么办?](https://mp.weixin.qq.com/s/tZqOH_8QTKrD1oaclNoewg)
[高性能日志脱敏组件(四)基于 log4j2 插件实现统一日志脱敏,性能远超正则替换](https://mp.weixin.qq.com/s/ZlWRqT7S92aXFuy-l9Uh3Q)
[高性能日志脱敏组件(五)已支持 log4j2 和 logback 插件](https://mp.weixin.qq.com/s/3ARK6PW7pyUhAbO2ctnndg)
# 快速开始
## maven 引入
```xml
com.github.houbb
auto-log-core
0.12.0```
## 入门案例
```java
UserService userService = AutoLogHelper.proxy(new UserServiceImpl());
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
```java
public interface UserService {String queryLog(final String id);
}
```- UserServiceImpl.java
直接使用注解 `@AutoLog` 指定需要打日志的方法即可。
```java
public class UserServiceImpl implements UserService {@Override
@AutoLog(description = "查询日志", enableTraceId = true)
public String queryLog(String id) {
return "result-"+id;
}}
```# 注解说明
## @AutoLog
核心注解 `@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 即可。
# 自定义策略
## 自定义日志拦截器(interceptor)
### 内置拦截器
`AutoLogCommonFilter` 默认日志增强实现
### 定义
直接实现 `CommonFilter` 类,并且实现对应的方法即可。
```java
package com.github.houbb.auto.log.test.interceptor;import com.github.houbb.auto.log.core.constant.AutoLogAttachmentKeyConst;
import com.github.houbb.common.filter.annotation.FilterActive;
import com.github.houbb.common.filter.api.CommonFilter;
import com.github.houbb.common.filter.api.Invocation;
import com.github.houbb.common.filter.api.Invoker;
import com.github.houbb.common.filter.api.Result;
import com.github.houbb.common.filter.exception.CommonFilterException;/**
* 自定义日志拦截器
* @author binbin.hou
* @since 0.0.12
*/
@FilterActive(order = 1)
public class MyAutoLogInterceptor implements CommonFilter {@Override
public Result invoke(Invoker invoker, Invocation invocation) throws CommonFilterException {
final String tid = (String) invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_TRACE_ID);
System.out.println("my test filter before " + tid);
Result result = invoker.invoke(invocation);
System.out.println("my test filter after " + tid);return result;
}}
```我们可以通过 `@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 2bc181d4efb8408e948072022c9227c0
my 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` 类实现对应的方法即可。
```java
public class MyParamFilter extends AbstractParamFilter {@Override
protected Object[] doFilter(Object[] params) {
Object[] newParams = new Object[1];
newParams[0] = "设置我我想要的值";
return newParams;
}}
```### 使用
指定对应的参数过滤器。这样,无论入参是什么,都会变成我们指定的 `[设置我我想要的值]`。
```java
@AutoLog(paramFilter = MyParamFilter.class)
public String paramFilter() {
return "自定义入参过滤器";
}
```# spring 整合使用
完整示例参考 [SpringServiceTest](https://github.com/houbb/auto-log/tree/master/auto-log-test/src/test/java/com/github/houbb/auto/log/spring/SpringServiceTest.java)
## maven 引入
```xml
com.github.houbb
auto-log-spring
0.12.0```
## 注解声明
使用 `@EnableAutoLog` 启用自动日志输出
```java
@Configurable
@ComponentScan(basePackages = "com.github.houbb.auto.log.test.service")
@EnableAutoLog
public class SpringConfig {
}
```## 测试代码
```java
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringServiceTest {@Autowired
private UserService userService;@Test
public void queryLogTest() {
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` 的属性值即可。
### 测试例子
> [完整测试代码](https://github.com/houbb/auto-log/blob/master/auto-log-test/src/test/java/com/github/houbb/auto/log/dynamic/SpringDynamicServiceTest.java)
我们在配置文件 `autoLogConfig.properties` 中自定义下包扫描的范围:
```
auto.log.pointcut=execution(* com.github.houbb.auto.log.test.dynamic.service.MyAddressService.*(..))
```自定义测试 service
```java
package com.github.houbb.auto.log.test.dynamic.service;import org.springframework.stereotype.Service;
@Service
public class MyAddressService {public String queryAddress(String id) {
return "address-" + id;
}}
```自定义 spring 配置,指定我们定义的配置文件。springboot 啥的,可以直接放在 application.properties 中指定,此处仅作为演示。
```java
@Configurable
@ComponentScan(basePackages = "com.github.houbb.auto.log.test.dynamic.service")
@EnableAutoLog
@PropertySource("classpath:autoLogConfig.properties")
public class SpringDynamicConfig {
}
```测试
```java
@ContextConfiguration(classes = SpringDynamicConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringDynamicServiceTest {@Autowired
private MyAddressService myAddressService;@Autowired
private MyUserService myUserService;@Test
public void queryUserTest() {
// 不会被日志拦截
myUserService.queryUser("1");
}@Test
public void queryAddressTest() {
// 会被日志拦截
myAddressService.queryAddress("1");
}}
```# springboot 整合使用
## maven 引入
```xml
com.github.houbb
auto-log-springboot-starter
0.12.0```
只需要引入 jar 即可,其他的什么都不用配置。
使用方式和 spring 一致。
## 测试
```java
@Autowired
private UserService userService;@Test
public void queryLogTest() {
userService.query("spring-boot");
}
```# 开源地址
> Github: [https://github.com/houbb/auto-log](https://github.com/houbb/auto-log)
> Gitee: [https://gitee.com/houbinbin/auto-log](https://gitee.com/houbinbin/auto-log)
# Road-Map
- [ ] distributed trace
- [ ] 全局配置 比如全局的慢日志阈值设置等 参考 sandglass 中如何加载注解中的配置信息?(基于配置文件)
- [x] 比例采样策略
- [x] 自适应采样策略
- [x] 改进 interceptor 拦截器,类似 dubbo filter
- [x] 优化日志中的方法路径名称
- [ ] 编译时注解特性 类似 aspectj
- [ ] 基于 agent 特性,类似 sky-walking
---------------------------------------------------
- [ ] 流程
日志/trace 信息的生成
采集
存储
检索/分析
可视化
# 开源矩阵
| 编号 | 名称 | 简介 | 标签 |
|:----|:----|:----|:----|
| 1 | [sensitive](https://github.com/houbb/sensitive) | 基于注解的日志脱敏框架,更加优雅的日志打印 | 工具,日志 |
| 2 | [auto-log](https://github.com/houbb/auto-log) | 日志自动输出 | 工具,日志 |
| 3 | [heaven](https://github.com/houbb/heaven) | 收集开发中常用的工具类 | 工具 |
| 4 | [resubmit](https://github.com/houbb/resubmit) | 防止重复提交框架 | 工具 |
| 5 | [validator](https://github.com/houbb/validator) | 新一代校验框架 | 工具 |
| 6 | [rate-limit](https://github.com/houbb/rate-limit) | 渐进式限流工具框架 | 工具 |
| 7 | [lock](https://github.com/houbb/lock) | 开箱即用分布式锁 | 工具 |
| 8 | [lombok-ex](https://github.com/houbb/lombok-ex) | 编译时注解框架,扩展 lombok | 工具 |
| 9 | [csv](https://github.com/houbb/csv) | CSV的读写工具 | 工具 |
| 10 | [iexcel](https://github.com/houbb/iexcel) | EXCEL的读写工具,避免OOM | 工具 |
| 11 | [leetcode](https://github.com/houbb/leetcode) | 力扣算法个人学习笔记 | 学习 |
| 12 | [awesome-metaverse-zh](https://github.com/houbb/awesome-metaverse-zh) | 元宇宙精选 | 学习 |
| 13 | [rpc](https://github.com/houbb/rpc) | 手写rpc框架 | 学习,中间件 |
| 14 | [mybatis](https://github.com/houbb/mybatis) | 手写mybatis框架 | 学习,中间件 |
| 15 | [cache](https://github.com/houbb/cache) | 手写redis框架 | 学习,中间件 |
| 16 | [mq](https://github.com/houbb/mq) | 手写mq框架 | 学习,中间件 |
| 17 | [ioc](https://github.com/houbb/ioc) | 手写spring ioc框架 | 学习,中间件 |
| 18 | [async](https://github.com/houbb/async) | 手写线程池异步框架 | 学习,中间件 |
| 19 | [jdbc-pool](https://github.com/houbb/jdbc-pool) | 手写数据库连接池实现 | 学习,中间件 |
| 20 | [sisyphus](https://github.com/houbb/sisyphus) | 支持注解的重试框架 | 学习,中间件 |
| 21 | [sandglass](https://github.com/houbb/sandglass) | 任务调度时间框架 | 学习,中间件 |
| 22 | [segment](https://github.com/houbb/segment) | 基于结巴的分词实现 | NLP |
| 23 | [pinyin](https://github.com/houbb/pinyin) | 高性能中文转拼音工具 | NLP |
| 24 | [opencc4j](https://github.com/houbb/opencc4j) | 中文繁简体转换 | NLP |
| 25 | [word-checker](https://github.com/houbb/word-checker) | 中英文拼写检测 | NLP |
| 26 | [sensitive-word](https://github.com/houbb/sensitive-word) | 敏感词 | NLP |
| 27 | [nlp-hanzi-similar](https://github.com/houbb/nlp-hanzi-similar) | 汉字相似度 | NLP |
| 28 | [word-cloud](https://github.com/houbb/word-cloud) | 好用的词云工具 | DOC |
| 29 | [markdown-toc](https://github.com/houbb/markdown-toc) | 为文档生成目录 | DOC |
| 30 | [idoc](https://github.com/houbb/idoc) | 项目自动生成文档 | DOC |
| 31 | [metadata](https://github.com/houbb/metadata) | 数据库元数据表文档生成 | DOC |
| 32 | [data-factory](https://github.com/houbb/data-factory) | 测试自动生成对象信息 | TEST |
| 33 | [junitperf](https://github.com/houbb/junitperf) | 性能测试框架,测试报告生成 | TEST |
| 34 | [houbb.github.io](https://github.com/houbb/houbb.github.io) | 个人博客 | 学习 |