1. 引包
<!-- 点评cat-->
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId>
<version>3.0.0</version>
</dependency>
2. 引入cat的核心过滤器
import com.dianping.cat.servlet.CatFilter;
/**
* 引入这个以后cat项目就能监控到你访问的url
* @author :yepk
* @version :1.0
* @apiNote :cat核心过滤器
* @date :2020-06-18-9:04
*/
@Component
public class CatFilterConfigure {
@Bean
public FilterRegistrationBean catFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
CatFilter filter = new CatFilter();
registration.setFilter(filter);
registration.addUrlPatterns("/*");
registration.setName("cat-filter");
registration.setOrder(1);
return registration;
}
}
3. 建立项目名称配置文件
4. 建立配置文件位置
从项目位置的根目录创建
- client.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<!-- ip:部署CAT应用的服务器IP
port:CAT服务端接收客户端数据的端口(不允许更改)
http-port:CAT应用部署到的容器的端口(tomcat的端口)
-->
<server ip="xx.xx.xx.xx" port="2280" http-port="8089" />
</servers>
</config>
- cat项目的日志目录
5. 集成mybatis拦截器
目前只能拦截到增删改
import com.dianping.cat.Cat;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
/***
* @apiNote 点评cat mybatis拦截器
* @author yepk
* @date 2020/6/18 16:29
*/
@Slf4j
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
@Component
public class CatMybatisInterceptor implements Interceptor {
private Properties properties;
@Value("${spring.datasource.url}")
private String datasourceUrl;
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
String methodName = this.getMethodName(mappedStatement);
Transaction t = Cat.newTransaction("SQL", methodName);
Cat.logEvent("SQL.Database", datasourceUrl);
Cat.logEvent("SQL.Method", mappedStatement.getSqlCommandType().name().toLowerCase(), Message.SUCCESS, getSql(invocation, mappedStatement));
try {
Object returnValue = invocation.proceed();
t.setStatus(Transaction.SUCCESS);
return returnValue;
} catch (Throwable e) {
Cat.logError(e);
t.setStatus(e);
throw e;
} finally {
t.complete();
}
}
private String getMethodName(MappedStatement mappedStatement) {
String[] strArr = mappedStatement.getId().split("\\.");
return strArr[strArr.length - 2] + "." + strArr[strArr.length - 1];
}
private String getSql(Invocation invocation, MappedStatement mappedStatement) {
Object parameter = null;
if (invocation.getArgs().length > 1) {
parameter = invocation.getArgs()[1];
}
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
Configuration configuration = mappedStatement.getConfiguration();
return showSql(configuration, boundSql);
}
private static String getParameterValue(Object obj) {
StringBuilder retStringBuilder = new StringBuilder();
if (obj instanceof String) {
retStringBuilder.append("'").append(obj).append("'");
} else if (obj instanceof Date) {
DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);
retStringBuilder.append("'").append(formatter.format(new Date())).append("'");
} else {
retStringBuilder.append("'").append(obj == null ? "" : obj).append("'");
}
return retStringBuilder.toString();
}
public static String showSql(Configuration configuration, BoundSql boundSql) {
Object parameterObject = boundSql.getParameterObject();
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
StringBuilder sqlBuilder = new StringBuilder(sql);
if (parameterMappings.size() > 0 && parameterObject != null) {
int start = sqlBuilder.indexOf("?");
int end = start + 1;
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
sqlBuilder.replace(start, end, getParameterValue(parameterObject));
} else {
MetaObject metaObject = configuration.newMetaObject(parameterObject);
for (ParameterMapping parameterMapping : parameterMappings) {
String propertyName = parameterMapping.getProperty();
if (metaObject.hasGetter(propertyName)) {
Object obj = metaObject.getValue(propertyName);
sqlBuilder.replace(start, end, getParameterValue(obj));
} else if (boundSql.hasAdditionalParameter(propertyName)) {
Object obj = boundSql.getAdditionalParameter(propertyName);
sqlBuilder.replace(start, end, getParameterValue(obj));
}
start = sqlBuilder.indexOf("?");
end = start + 1;
}
}
}
return sqlBuilder.toString();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
this.properties = properties;
}
}
6.将mybatis拦截器注入到sqlSessionFactory
import org.apache.ibatis.plugin.Interceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author :yepk
* @version :1.0
* @apiNote :cat配置
* @date :2020-06-18-8:56
*/
@Component
public class CatMyBatisPlusConfiguration {
@Resource
private CatMybatisInterceptor catMybatisInterceptor;
@Bean
public Interceptor[] plugins() {
return new Interceptor[]{catMybatisInterceptor};
}
}
7. 最重要一点
点评cat jar包来自点评的私服,所以要加私服地址,不然jar包下载不下来的。
<repositories>
<!-- CAT client 仓库 -->
<repository>
<id>unidal-nexus-repo</id>
<url>http://unidal.org/nexus/content/repositories/releases</url>
</repository>
</repositories>