链路追踪和elasticsearch整合
This commit is contained in:
@@ -33,6 +33,23 @@
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.elasticsearch.client</groupId>
|
||||
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
||||
<version>7.6.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.elasticsearch.client</groupId>
|
||||
<artifactId>elasticsearch-rest-client</artifactId>
|
||||
<version>7.6.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.elasticsearch</groupId>
|
||||
<artifactId>elasticsearch</artifactId>
|
||||
<version>7.6.1</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.dynamictp</groupId>
|
||||
<artifactId>dynamic-tp-spring-boot-starter-common</artifactId>
|
||||
@@ -96,25 +113,6 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!--日志管理-->
|
||||
<dependency>
|
||||
<groupId>com.plumelog</groupId>
|
||||
<artifactId>plumelog-lite-spring-boot-starter</artifactId>
|
||||
<version>3.5.3</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>plumelog-core</artifactId>
|
||||
<groupId>com.plumelog</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.plumelog</groupId>
|
||||
<artifactId>plumelog-trace</artifactId>
|
||||
<version>3.5.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||
@@ -167,11 +165,12 @@
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
<!--Spring boot 安全框架-->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||
<!-- <artifactId>spring-boot-starter-security</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>com.internetitem</groupId>
|
||||
<artifactId>logback-elasticsearch-appender</artifactId>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Sa-Token 权限认证 安全框架, 在线文档:http://sa-token.dev33.cn/ -->
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
package org.nl;
|
||||
|
||||
import org.apache.http.HttpHost;
|
||||
import org.elasticsearch.action.search.SearchRequest;
|
||||
import org.elasticsearch.action.search.SearchResponse;
|
||||
import org.elasticsearch.client.RequestOptions;
|
||||
import org.elasticsearch.client.RestClient;
|
||||
import org.elasticsearch.client.RestHighLevelClient;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
import org.elasticsearch.rest.RestStatus;
|
||||
import org.elasticsearch.search.SearchHit;
|
||||
import org.elasticsearch.search.SearchHits;
|
||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author ldjun
|
||||
* @version 1.0
|
||||
* @date 2023年02月06日 18:49
|
||||
* @desc desc
|
||||
*/
|
||||
@Configuration
|
||||
public class ElasticSearchClientConfig {
|
||||
|
||||
|
||||
//配置RestHighLevelClient依赖到spring容器中待用
|
||||
@Bean
|
||||
public RestHighLevelClient restHighLevelClient() {
|
||||
RestHighLevelClient client = new RestHighLevelClient(
|
||||
RestClient.builder(
|
||||
//绑定本机,端口,协议,如果是ES集群,就配置多个
|
||||
new HttpHost("127.0.0.1", 9200, "http")));
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
// 指定ip 端口
|
||||
HttpHost[] httpHosts = {new HttpHost("47.111.78.178", 27017, "http")};
|
||||
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(httpHosts));
|
||||
|
||||
SearchRequest searchRequest = new SearchRequest("logs-2023-02-06");
|
||||
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
|
||||
sourceBuilder.query(QueryBuilders.matchQuery("_id", "HzAeJoYBlkwLvExN1Vg4"));
|
||||
searchRequest.source(sourceBuilder);
|
||||
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
|
||||
RestStatus restStatus = searchResponse.status();
|
||||
System.out.println(restStatus);
|
||||
if (restStatus == RestStatus.OK) {
|
||||
SearchHits searchHits = searchResponse.getHits();
|
||||
for (SearchHit searchHit: searchHits) {
|
||||
System.out.println("id:" + searchHit.getId());
|
||||
System.out.println("index:" + searchHit.getIndex());
|
||||
System.out.println("score:" + searchHit.getScore());
|
||||
Map<String, Object> map = searchHit.getSourceAsMap();
|
||||
System.out.println("name:" + (String) map.get("name"));
|
||||
System.out.println("city:" + (String) map.get("city"));
|
||||
System.out.println("price:" + (Double) map.get("price"));
|
||||
}
|
||||
}
|
||||
restHighLevelClient.close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package org.nl.common;
|
||||
|
||||
/**
|
||||
* @author ldjun
|
||||
* @version 1.0
|
||||
* @date 2023年02月07日 11:05
|
||||
* @desc desc
|
||||
*/
|
||||
|
||||
import org.nl.common.utils.IdUtil;
|
||||
import org.slf4j.MDC;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.annotation.WebFilter;
|
||||
import java.io.IOException;
|
||||
@WebFilter(urlPatterns = "/*", filterName = "logMdcFilter")
|
||||
public class LogMdcFilter implements Filter {
|
||||
private static final String UNIQUE_ID = "traceId";
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
||||
boolean bInsertMDC = insertMDC();
|
||||
try {
|
||||
chain.doFilter(request, response);
|
||||
} finally {
|
||||
if(bInsertMDC) {
|
||||
MDC.remove(UNIQUE_ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
}
|
||||
|
||||
private boolean insertMDC() {
|
||||
String uniqueId = IdUtil.getStringId();
|
||||
MDC.put(UNIQUE_ID, uniqueId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package org.nl.common.annotation;
|
||||
|
||||
/**
|
||||
* @author ldjun
|
||||
* @version 1.0
|
||||
* @date 2023年02月07日 10:27
|
||||
* @desc desc
|
||||
*/
|
||||
public enum InterfaceLogType {
|
||||
DEFAULT("默认"),
|
||||
LMS_TO_MES("LMS请求MES"),
|
||||
MES_TO_LMS("MES请求LMS"),
|
||||
LMS_TO_CRM("LMS请求CRM"),
|
||||
CRM_TO_LMS("CRM请求LMS"),
|
||||
LMS_TO_SAP("LMS请求SAP"),
|
||||
SAP_TO_LMS("SAP请求LMS"),
|
||||
LMS_TO_ACS("LMS请求ACS"),
|
||||
ACS_TO_LMS("ACS请求LMS");
|
||||
|
||||
private String desc;
|
||||
|
||||
InterfaceLogType(String desc) {
|
||||
this.desc=desc;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
}
|
||||
@@ -28,4 +28,34 @@ import java.lang.annotation.Target;
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface Log {
|
||||
String value() default "";
|
||||
|
||||
/**
|
||||
* 是否打印到日志文件
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
boolean isPrintToLogFile() default false;
|
||||
|
||||
|
||||
/**
|
||||
* 是否插入操作日志表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
boolean isAddLogTable() default true;
|
||||
|
||||
/**
|
||||
* 是否接口日志
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
boolean isInterfaceLog() default false;
|
||||
|
||||
/**
|
||||
* 接口日志类型
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
InterfaceLogType interfaceLogType() default InterfaceLogType.DEFAULT;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright 2019-2020 Zheng Jie
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.nl.common.aspect;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Parameter;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author Zheng Jie
|
||||
* @date 2018-11-24
|
||||
*/
|
||||
@Component
|
||||
@Aspect
|
||||
@Slf4j
|
||||
public class LogAspect {
|
||||
|
||||
|
||||
ThreadLocal<Long> currentTime = new ThreadLocal<>();
|
||||
|
||||
|
||||
/**
|
||||
* 配置切入点
|
||||
*/
|
||||
@Pointcut("@annotation(org.nl.common.annotation.Log)")
|
||||
public void logPointcut() {
|
||||
// 该方法无方法体,主要为了让同类中其他方法使用此切入点
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置环绕通知,使用在方法logPointcut()上注册的切入点
|
||||
*
|
||||
* @param joinPoint join point for advice
|
||||
*/
|
||||
@Around("logPointcut()")
|
||||
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||
String trackId = UUID.randomUUID().toString();
|
||||
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||||
Method method = signature.getMethod();
|
||||
// 方法路径
|
||||
String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
|
||||
String params = getParameter(method, joinPoint.getArgs());
|
||||
|
||||
org.nl.common.annotation.Log logInfo = method.getAnnotation(org.nl.common.annotation.Log.class);
|
||||
|
||||
//是否输出到日志文件
|
||||
if (logInfo.isPrintToLogFile()) {
|
||||
log.info("track_id:{},请求方法:{},请求方法参数:{}",trackId,methodName,params);
|
||||
}
|
||||
Object result;
|
||||
currentTime.set(System.currentTimeMillis());
|
||||
try {
|
||||
result = joinPoint.proceed();
|
||||
// log.info("返回结果:"+JSONObject.parse(((ResponseEntity) result).getBody().toString()));
|
||||
}catch (Exception ex){
|
||||
log.error("track_id:{},error:{}",trackId,ex.getMessage());
|
||||
throw ex;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据方法和传入的参数获取请求参数
|
||||
*/
|
||||
private String getParameter(Method method, Object[] args) {
|
||||
List<Object> argList = new ArrayList<>();
|
||||
Parameter[] parameters = method.getParameters();
|
||||
for (int i = 0; i < parameters.length; i++) {
|
||||
//将RequestBody注解修饰的参数作为请求参数
|
||||
RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
|
||||
if (requestBody != null) {
|
||||
argList.add(args[i]);
|
||||
}
|
||||
//将RequestParam注解修饰的参数作为请求参数
|
||||
RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);
|
||||
if (requestParam != null) {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
String key = parameters[i].getName();
|
||||
if (!StrUtil.isEmpty(requestParam.value())) {
|
||||
key = requestParam.value();
|
||||
}
|
||||
map.put(key, args[i]);
|
||||
argList.add(map);
|
||||
}
|
||||
}
|
||||
if (argList.size() == 0) {
|
||||
return "";
|
||||
}
|
||||
return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置异常通知
|
||||
*
|
||||
* @param joinPoint join point for advice
|
||||
* @param e exception
|
||||
*/
|
||||
// @AfterThrowing(pointcut = "logPointcut()", throwing = "e")
|
||||
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
|
||||
// logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint) joinPoint, log);
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
try {
|
||||
return SecurityUtils.getCurrentUsername();
|
||||
} catch (Exception e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,6 +39,7 @@ public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, Param> impl
|
||||
|
||||
@Override
|
||||
public Page<Param> queryPage(Map whereJson, PageQuery page) {
|
||||
log.info("111");
|
||||
QueryWrapper<Param> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.orderBy(true, true, "create_time");
|
||||
Page<Param> paramPage = paramMapper.selectPage(page.build(), queryWrapper);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
_ _ ___________ _ _____ _ ___________ _____
|
||||
| \ | | _ | ___ \ | | ___| | | ___| ___|_ _|
|
||||
| \| | | | | |_/ / | | |__ | | | |__ | |_ | |
|
||||
| . ` | | | | ___ \ | | __|| | | __|| _| | |
|
||||
| |\ \ \_/ / |_/ / |____| |___| |____| |___| | | |
|
||||
\_| \_/\___/\____/\_____/\____/\_____/\____/\_| \_/
|
||||
_ _ ___________ _ _____ _ ___________ _____
|
||||
| \ | | _ | ___ \ | | ___| | |_ _| ___|_ _|
|
||||
| \| | | | | |_/ / | | |__ | | | | | |_ | |
|
||||
| . ` | | | | ___ \ | | __|| | | | | _| | |
|
||||
| |\ \ \_/ / |_/ / |____| |___| |_____| |_| | | |
|
||||
\_| \_/\___/\____/\_____/\____/\_____/\___/\_| \_/
|
||||
|
||||
:: Spring Boot :: (v2.1.0.RELEASE)
|
||||
@@ -60,7 +60,6 @@ security:
|
||||
- /api/localStorage/pictures
|
||||
# 参数
|
||||
- /api/param/getValueByCode
|
||||
- /plumelog/**
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
@@ -70,17 +69,15 @@ mybatis-plus:
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: INPUT
|
||||
plumelog:
|
||||
model: redis #值为4种 redis,kafka,rest,restServer,lite
|
||||
lite:
|
||||
log:
|
||||
path: /lucene2
|
||||
|
||||
banner: false
|
||||
arthas:
|
||||
agent-id: hsehdfsfghhwertyfad
|
||||
tunnel-server: ws://127.0.0.1:7777/ws
|
||||
enable-detail-pages: true
|
||||
ip: 127.0.0.1
|
||||
telnetPort: 7777
|
||||
|
||||
management:
|
||||
health:
|
||||
elasticsearch:
|
||||
enabled: false #取消对elasticsearch的检查 https://www.codeleading.com/article/60643988608/
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ https://juejin.cn/post/6844903775631572999
|
||||
<contextName>nlAdmin</contextName>
|
||||
<property name="log.charset" value="utf-8"/>
|
||||
<property name="log.pattern"
|
||||
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
|
||||
value="%black(%contextName-) %X{traceId} %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
|
||||
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
||||
<property name="SYSTEM_NAME" value="${systemName}"/>
|
||||
<property name="LOG_HOME" value="${logPath}"/>
|
||||
@@ -55,24 +55,81 @@ https://juejin.cn/post/6844903775631572999
|
||||
<appender-ref ref="FILE"/>
|
||||
</appender>
|
||||
|
||||
<appender name="plumelog" class="com.plumelog.lite.logback.appender.LiteAppender">
|
||||
<appName>plumelog</appName>
|
||||
<!-- 日志存储位置 -->
|
||||
<logPath>/plumelog/lite</logPath>
|
||||
<!-- 日志保留天数 -->
|
||||
<keepDay>30</keepDay>
|
||||
<expand>sleuth</expand>
|
||||
<appender name="plumelog" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender">
|
||||
<url>http://47.111.78.178:27017/_bulk</url>
|
||||
<index>logs-%date{yyyy-MM-dd}</index>
|
||||
<type>tester</type>
|
||||
<loggerName>es-logger</loggerName> <!-- optional -->
|
||||
<errorLoggerName>es-error-logger</errorLoggerName> <!-- optional -->
|
||||
<connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) -->
|
||||
<errorsToStderr>false</errorsToStderr> <!-- optional (default false) -->
|
||||
<includeCallerData>false</includeCallerData> <!-- optional (default false) -->
|
||||
<logsToStderr>false</logsToStderr> <!-- optional (default false) -->
|
||||
<maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) -->
|
||||
<maxRetries>3</maxRetries> <!-- optional (default 3) -->
|
||||
<readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) -->
|
||||
<sleepTime>250</sleepTime> <!-- optional (in ms, default 250) -->
|
||||
<rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) -->
|
||||
<includeMdc>false</includeMdc> <!-- optional (default false) -->
|
||||
<maxMessageSize>5</maxMessageSize> <!-- optional (default -1 -->
|
||||
<!-- <authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication" /> <!– optional –>-->
|
||||
<properties>
|
||||
<property>
|
||||
<name>host</name>
|
||||
<value>${HOSTNAME}</value>
|
||||
<allowEmpty>false</allowEmpty>
|
||||
</property>
|
||||
<property>
|
||||
<name>severity</name>
|
||||
<value>%level</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>thread</name>
|
||||
<value>%thread</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>stacktrace</name>
|
||||
<value>%ex</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>logger</name>
|
||||
<value>%logger</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>traceId</name>
|
||||
<value>%X{traceId}</value>
|
||||
</property>
|
||||
</properties>
|
||||
<headers>
|
||||
<header>
|
||||
<name>Content-Type</name>
|
||||
<value>application/json</value>
|
||||
</header>
|
||||
</headers>
|
||||
</appender>
|
||||
|
||||
|
||||
<!--开发环境:打印控制台-->
|
||||
<springProfile name="dev">
|
||||
<root level="debug">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
<!-- <appender-ref ref="plumelog" />-->
|
||||
<appender-ref ref="plumelog" />
|
||||
</root>
|
||||
<logger name="org.springframework" level="ERROR" additivity="false">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</logger>
|
||||
<logger name="org.mybatis" level="ERROR" additivity="false">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</logger>
|
||||
<logger name="com.baomidou" level="ERROR" additivity="false">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</logger>
|
||||
<logger name="com.dtp" level="ERROR" additivity="false">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</logger>
|
||||
<logger name="es-logger" level="ERROR" additivity="false">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</logger>
|
||||
<logger name="org.apache" level="ERROR" additivity="false">
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</logger>
|
||||
|
||||
Reference in New Issue
Block a user