代码拉取完成,页面将自动刷新
linkLog通过拦截主流框架请求,添加traceId的进行系统间传导,然后通过slf4j的MDC功能打印到日志中,从而达到日志链路跟踪的效果
链路跟踪主要有traceId和spanId两个组成,traceId为单次请求的全局唯一ID,spanId为所在请求的节点ID(为树结构)。
如图:
说明:修改/添加 linklog.properties 文件
### k=v 键值对 k=logger的名称 v=日志级别
### k:LoggerFactory.getLogger(LinkLog.class)获取logger的时候 k为LinkLog全路径类名
### v: 日志级别包含 OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
cn.ry.LinkLog=DEBUG
支持的日志框架:logback,log4j,log4j2
自动适配的框架:SpringBoot,SpringMVC,Fegin,Spring GateWay,Dubbo
HttpClient接入方式:
//添加LinkLogHttpRequestInterceptor拦截器
CloseableHttpClient httpClient = HttpClientBuilder.create()
.addInterceptorFirst(new LinkLogHttpRequestInterceptor())
.build();
//添加LinkLogRestTemplateFilter拦截器
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new LinkLogRestTemplateFilter()));
//添加LinkLogOkHttpInterceptor拦截器
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LinkLogOkHttpInterceptor())
.build();
ClientBuilder clientBuilder = ClientBuilder.newBuilder();
Client client=clientBuilder.withConfig(new ClientConfig(LinkLogJerseyFilter.class)).build();
<dependency>
<groupId>io.gitee.reywong</groupId>
<artifactId>ry-linklog</artifactId>
<version>1.0.1-releases</version>
</dependency>
pattern中添加
%X{linkLog}
如:
<appender name="messageText_console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%X{linkLog}] [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger:%line] %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
A系统 调用 B系统
public String linklog(HttpServletRequest request, HttpServletResponse response) {
StringBuilder stringBuilder = new StringBuilder();
logger.info("1.请求参数{}", "reywong");
List<String> sayList = demoServer.sayHello("reywong");
if (sayList != null) {
for (String say : sayList) {
stringBuilder.append(say);
}
}
String result = stringBuilder.toString();
logger.info(result);
logger.info("2.请求参数{}", "reywong");
demoServer.sayHello("reywong");
logger.info("3.httpclient 请求接口");
httpClient();
return result;
}
public String httpClient() {
String msg = "";
// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
CloseableHttpClient httpClient = HttpClientBuilder
.create()
.addInterceptorFirst(new LinkLogHttpRequestInterceptor())
.build();
// 创建Get请求
HttpGet httpGet = new HttpGet("http://localhost:8082/springMvc");
// 响应模型
CloseableHttpResponse response = null;
try {
Thread.sleep(1000);
// 由客户端执行(发送)Get请求
logger.info("request springMVC");
response = httpClient.execute(httpGet);
// 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
msg = responseEntity.toString();
if (responseEntity != null) {
logger.info("reponse get springMVC");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return msg;
}
}
@RequestMapping("/springMvc")
public String springMvc(HttpServletRequest request, HttpServletResponse response) {
logger.info("linkLog-Server springMvc");
return "springMvc";
}
项目中提供了测试项目,可以直接运行
LinkLog-example/link-example-dubbo 提供了springMvc和dubbo的测试用例。
步骤如下:
<bean class="cn.com.ry.framework.linklog.LinkLogInit"></bean>
-XX:-OmitStackTraceInFastThrow
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。