namkyu
10/15/2015 - 2:19 AM

RestTemplateLoggingRequestInterceptor.java

@Slf4j
public class RestTemplateLoggingRequestInterceptor implements ClientHttpRequestInterceptor {

	/**
	 * <pre>
	 * intercept
	 *
	 * <pre>
	 *
	 * @param request
	 * @param body
	 * @param execution
	 * @return
	 * @throws IOException
	 */
	@Override
	public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

		// 사용자 정보 추출
		String userId = "aaaa";

		// request log
		URI uri = request.getURI();
		traceRequest(request, body, userId);

		// execute
		ClientHttpResponse response = execution.execute(request, body);

		// response log
		traceResponse(response, userId, uri);
		return response;
	}

	/**
	 * <pre>
	 * traceRequest
	 *
	 * <pre>
	 * @param request
	 * @param body
	 * @param userId
	 * @throws IOException
	 */
	private void traceRequest(HttpRequest request, byte[] body, String userId) throws IOException {
		StringBuilder reqLog = new StringBuilder();
		reqLog.append("[REQUEST] ");
		reqLog.append("Uri : " + request.getURI());
		reqLog.append(", Method : " + request.getMethod());
		reqLog.append(", Request Body : " + new String(body, StandardCharsets.UTF_8));
		reqLog.append(", UserId : " + userId);
		log.info(reqLog.toString());
	}

	/**
	 * <pre>
	 * traceResponse
	 *
	 * <pre>
	 * @param response
	 * @param userId
	 * @throws IOException
	 */
	private void traceResponse(ClientHttpResponse response, String userId, URI uri) throws IOException {
		InputStream is = response.getBody();
		byte[] bodyData = IOUtils.toByteArray(is);

		StringBuilder resLog = new StringBuilder();
		resLog.append("[RESPONSE] ");
		resLog.append("Uri : " + uri);
		resLog.append(", Status code : " + response.getStatusCode());
		resLog.append(", Response Body : " + new String(bodyData, StandardCharsets.UTF_8));
		resLog.append(", UserId : " + userId);
		log.info(resLog.toString());
	}
}