当前位置: 代码迷 >> 综合 >> 关于springboot网络请求日志打印的两种方法
  详细解决方案

关于springboot网络请求日志打印的两种方法

热度:96   发布时间:2023-09-18 16:27:18.0

springboot中网络请求一般是使用RestTemple类完成

1、RestTemple继承了InterceptingHttpAccessor的类,可以添加拦截器。所以可以定义打印日志的拦截器,通过setInterceptors()方法赋给RestTemple实现请求前后的日志打印。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class);@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {traceRequest(request, body);ClientHttpResponse response = execution.execute(request, body);traceResponse(response);return response;}private void traceRequest(HttpRequest request, byte[] body) throws IOException {log.info("===========================request begin================================================");log.info("URI         : {}", request.getURI());log.info("Method      : {}", request.getMethod());log.info("Headers     : {}", request.getHeaders());log.info("Request body: {}", new String(body, "UTF-8"));log.info("==========================request end================================================");}private void traceResponse(ClientHttpResponse response) throws IOException {StringBuilder inputStringBuilder = new StringBuilder();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));String line = bufferedReader.readLine();while (line != null) {inputStringBuilder.append(line);inputStringBuilder.append('\n');line = bufferedReader.readLine();}log.info("============================response begin==========================================");log.info("Status code  : {}", response.getStatusCode());log.info("Status text  : {}", response.getStatusText());log.info("Headers      : {}", response.getHeaders());log.info("Response body: {}", inputStringBuilder.toString());log.info("=======================response end=================================================");}

拦截器调用方法

public static RestTemplate interceptRestTemplate(){RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();interceptors.add(new LoggingRequestInterceptor());restTemplate.setInterceptors(interceptors);return restTemplate;}

2、可以使用aop面向切面,将`restTemplate.postForEntity(url, request, String.class)` 等网络请求的调用方法提取到新建文件中,然后@Pointcut加入到切面,完成日志的打印