# xbd-trace
**Repository Path**: xbd521/xbd-trace
## Basic Information
- **Project Name**: xbd-trace
- **Description**: 基于Spring AOP的应用程序运行轨迹追踪记录框架
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 4
- **Created**: 2019-11-14
- **Last Updated**: 2021-12-27
## Categories & Tags
**Categories**: utils
**Tags**: None
## README
# xbd-trace
#### 介绍
基于Spring AOP的应用程序运行轨迹追踪记录框架
#### 特性
- 对应用程序基本零侵入
- 适配多spring版本
- 支持多场景、多方式配置方式
- 追踪数据覆盖广,包含源类、源方法、参数、返回、异常、时间等信息
- 配置方式简单易懂
## Spring Framework版本
spring version >= 4.3.x
推荐5.0系列及以上
## 使用说明
### 准备工作
编译打包,部署到maven私服
```
mvn clean deploy -Dmaven.test.skip=true
```
引入依赖
```xml
org.xbdframework
xbd-trace
版本号
```
### Java方式配置
注解方式
```java
@Configuration
public class TraceConfig {
@Bean
public TraceInterceptor traceInterceptor() {
TraceInterceptor interceptor = new TraceInterceptor();
AnnotationTraceAttributeSource traceAttributeSource = new AnnotationTraceAttributeSource(new DefaultTraceAnnotationParser());
interceptor.setTraceAttributeSource(traceAttributeSource);
return interceptor;
}
// BeanFactoryTraceAttributeSourceAdvisor Advice方式
@Bean
public BeanFactoryTraceAttributeSourceAdvisor beanFactoryTraceAttributeSourceAdvisor() {
BeanFactoryTraceAttributeSourceAdvisor advisor = new BeanFactoryTraceAttributeSourceAdvisor();
advisor.setAdvice(traceInterceptor());
advisor.setTraceAttributeSource(new AnnotationTraceAttributeSource(new DefaultTraceAnnotationParser()));
return advisor;
}
// BeanFactoryTraceAttributeSourceAdvisor AdviceBeanName方式
@Bean
public BeanFactoryTraceAttributeSourceAdvisor beanFactoryTraceAttributeSourceAdvisor() {
BeanFactoryTraceAttributeSourceAdvisor advisor = new BeanFactoryTraceAttributeSourceAdvisor();
advisor.setAdviceBeanName("traceInterceptor");
advisor.setTraceAttributeSource(new AnnotationTraceAttributeSource(new DefaultTraceAnnotationParser()));
return advisor;
}
// TraceAttributeSourceAdvisor 方式
@Bean
public TraceAttributeSourceAdvisor traceAttributeSourceAdvisor() {
TraceAttributeSourceAdvisor advisor = new TraceAttributeSourceAdvisor();
advisor.setTraceInterceptor(traceInterceptor());
return advisor;
}
}
@Traceable
@Service
public class UserServiceImpl implements UserService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void getUser(String id) {
this.logger.info("id is {}", id);
}
}
```
Aspect方式
```java
@Configuration
class TraceConfig {
@Bean
public TraceInterceptor traceInterceptor() {
TraceInterceptor interceptor = new TraceInterceptor();
// 仅日志记录
DefaultTraceAttribute defaultTraceAttribute = new DefaultTraceAttribute();
defaultTraceAttribute.setHandlers(DefaultTraceHandler.class);
// 不同日志name、特殊TraceHandler
DefaultTraceAttribute saveTraceAttribute = new DefaultTraceAttribute();
saveTraceAttribute.setLoggerName("x.y.z");
saveTraceAttribute.setHandlers(SaveTraceHandler.class);
NameMatchTraceAttributeSource attributeSource = new NameMatchTraceAttributeSource();
attributeSource.addTraceableMethod("save*", saveTraceAttribute);
attributeSource.addTraceableMethod("*", defaultTraceAttribute);
return interceptor;
}
@Bean
public Advisor traceAttributeSourceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* org.xbdframework.context.trace.service.impl..*ServiceImpl.*(..))");
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
advisor.setAdvice(traceInterceptor());
advisor.setPointcut(pointcut);
return advisor;
}
}
@Service
public class UserServiceImpl implements UserService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void getUser(String id) {
this.logger.info("id is {}", id);
}
}
```
### XML方式配置
```xml
```
### TraceHandler
示例:
```java
public class DefaultTraceHandler implements TraceHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void beforeHandle(Class> targetClass, Method method, Object[] arguments, LocalDateTime time) {
logger.info("targetClass is {}", targetClass);
logger.info("method is {}", method.getName());
logger.info("arguments is {}", arguments);
logger.info("time is {}", time);
}
@Override
public void errorHandle(Class> targetClass, Method method, Object[] arguments, Throwable exception, LocalDateTime time) {
logger.info("targetClass is {}", targetClass);
logger.info("method is {}", method.getName());
logger.info("arguments is {}", arguments);
logger.info("time is {}", time);
logger.info("exception is {}", exception);
}
@Override
public void afterHandle(Class> targetClass, Method method, Object[] arguments, Object returnValue, LocalDateTime time) {
logger.info("targetClass is {}", targetClass);
logger.info("method is {}", method.getName());
logger.info("arguments is {}", arguments);
logger.info("time is {}", time);
logger.info("returnValue is {}", returnValue);
}
}
```
说明:
* 可通过Autowired注入其它bean
### Traceable
* handlerRefs 与 handlers 选择其一赋值即可。如均赋值,以前者为准