diff --git a/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java b/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java index 56bb774..a8eec40 100644 --- a/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java +++ b/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java @@ -11,7 +11,9 @@ import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Properties; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; @@ -30,6 +32,7 @@ import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuil import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.apache.hc.client5.http.ssl.TrustAllStrategy; +import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.HttpRequest; import org.apache.hc.core5.http.HttpRequestInterceptor; import org.apache.hc.core5.http.HttpResponseInterceptor; @@ -40,6 +43,7 @@ import com.eactive.eai.adapter.AdapterManager; import com.eactive.eai.adapter.Keys; import com.eactive.eai.adapter.http.secure.HttpClient5SSLContextFactory; import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.logger.HttpAdapterExtraHeaderVo; import com.eactive.eai.common.message.EAIMessageKeys; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.server.EAIServerManager; @@ -416,8 +420,24 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap logProcessNo = 200; } - HttpAdapterExtraLogUtil.insertHttpAdapterExtraLog(uuid, logProcessNo, - contextAdapterGroupName, contextAdapterName, request.getHeaders(), url, request.getMethod()); + Header[] headers = request.getHeaders(); + List headerVoList = null; + if ( headers != null && headers.length != 0 ) { + headerVoList = HttpAdapterExtraLogUtil.convertHeaderToListOfHttpAdapterExtraHeaderVo(headers); + } else { + headerVoList = new ArrayList(); + } + + String trimedPostBody = (String) context.getAttribute(HttpAdapterExtraLogUtil.BODY_FIELD_NAME); + if(StringUtils.isNotEmpty(trimedPostBody)) { + HttpAdapterExtraHeaderVo vo = new HttpAdapterExtraHeaderVo(); + vo.setName(HttpAdapterExtraLogUtil.BODY_FIELD_NAME); + vo.setValue(trimedPostBody); + headerVoList.add(vo); + } + + HttpAdapterExtraLogUtil.insertHttpAdapterExtraLog(uuid, logProcessNo, + contextAdapterGroupName, contextAdapterName, headerVoList, url, request.getMethod(), 0); } catch (URISyntaxException e) { throw new RuntimeException(e); } @@ -443,7 +463,7 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap }else{ logProcessNo += 100; } - + HttpAdapterExtraLogUtil.insertHttpAdapterExtraLog(uuid, logProcessNo, contextAdapterGroupName, contextAdapterName, response.getHeaders(), url, request.getMethod(), response.getCode()); } catch (URISyntaxException e) { diff --git a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java index 5eb2fd7..7940de0 100644 --- a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java +++ b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java @@ -66,7 +66,9 @@ import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.CommonLib; +import com.eactive.eai.common.util.HttpAdapterExtraLogUtil; import com.eactive.eai.common.util.JacksonUtil; +import com.eactive.eai.common.util.RestSendBodyLogUtils; import com.eactive.eai.common.util.TxFileLogger; import com.eactive.eai.common.util.XMLUtils; import com.eactive.eai.util.JsonPathUtil; @@ -363,6 +365,8 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp configureHttpClient(requestConfigBuilder, vo, method); assignFilterHeaders(method, tempProp); // OutBound PreFilter에서 설정한 Header내용 설정. + + String postBody = ""; switch (HttpMethodType.getValue(rmethod)) { case GET: @@ -376,7 +380,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp //assignPostBody(dataContent, contentType, vo.getEncode(), method); // jwhong commnet // KJBank API 추적정보를 Header에 제공. jwhong // String inboundToken= assignRequestKJHeaders(method, prop, tempProp ); - assignPostBody(dataObject, mimeType, charset, method, chunked); + postBody = assignPostBody(dataObject, mimeType, charset, method, chunked); break; default: break; @@ -435,6 +439,11 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp if (logProcessNo != null && logProcessNo > 0) { context.setAttribute(HttpClientAdapterServiceKey.LOG_PROCESS_NO, logProcessNo); } + + if (RestSendBodyLogUtils.isBodyLoggingApi(tempProp.getProperty("API_SERVICE_CODE"))) { + String trimmedBody = RestSendBodyLogUtils.getBodyByMaxSize(postBody); + context.setAttribute(HttpAdapterExtraLogUtil.BODY_FIELD_NAME, trimmedBody); + } // encrypt algorithm type 추출 from adapter property jwhong // Properties properties = AdapterPropManager.getInstance().getProperties(vo.getAdapterName()); // jwhong @@ -859,6 +868,8 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp } protected void setAuthHeaders(HttpUriRequestBase method, String authorization, String authorizationHeaderName) throws Exception { + if(StringUtils.isEmpty(authorizationHeaderName)) + authorizationHeaderName = "Authorization"; method.setHeader(authorizationHeaderName, String.format("%s", authorization)); } diff --git a/src/main/java/com/eactive/eai/common/logger/HttpLoggingService.java b/src/main/java/com/eactive/eai/common/logger/HttpLoggingService.java index 4974f7d..a2bfb6f 100644 --- a/src/main/java/com/eactive/eai/common/logger/HttpLoggingService.java +++ b/src/main/java/com/eactive/eai/common/logger/HttpLoggingService.java @@ -1,6 +1,7 @@ package com.eactive.eai.common.logger; import com.eactive.eai.common.logger.mapper.HttpAdapterExtraLogMapper; +import com.eactive.eai.common.util.Logger; import com.eactive.eai.data.entity.onl.logger.HttpAdapterExtraLog; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -10,7 +11,9 @@ import org.springframework.stereotype.Service; @Service public class HttpLoggingService { - @Autowired + static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); + + @Autowired private HttpAdapterExtraLogMapper mapper; @Autowired @@ -24,6 +27,7 @@ public class HttpLoggingService { if (EAIDBLogControl.isEnable()) { try { dbLogger.save(httpAdapterExtraLog); + logger.debug("inserted to DB"); } catch(Exception e){ String message = e.getMessage(); // 오류 메시지 추가 - Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection @@ -33,9 +37,11 @@ public class HttpLoggingService { EAIDBLogControl.setEnable(false); } fileLogger.writeFileLog(httpAdapterExtraLog); + logger.debug("wrote to File"); } } else { fileLogger.writeFileLog(httpAdapterExtraLog); + logger.debug("wrote to File"); } } } diff --git a/src/main/java/com/eactive/eai/common/util/HttpAdapterExtraLogUtil.java b/src/main/java/com/eactive/eai/common/util/HttpAdapterExtraLogUtil.java index 4d3b341..ba04bfb 100644 --- a/src/main/java/com/eactive/eai/common/util/HttpAdapterExtraLogUtil.java +++ b/src/main/java/com/eactive/eai/common/util/HttpAdapterExtraLogUtil.java @@ -2,24 +2,25 @@ package com.eactive.eai.common.util; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; +import org.apache.hc.core5.http.Header; + import com.eactive.eai.common.logger.HttpAdapterExtraHeaderVo; import com.eactive.eai.common.logger.HttpAdapterExtraLogVo; import com.eactive.eai.common.logger.HttpLoggingService; import com.eactive.eai.common.logger.async.AsyncHttpLoggingPoolManager; import com.eactive.eai.env.ElinkConfig; -import org.apache.hc.core5.http.Header; -import org.apache.commons.lang3.StringUtils; public class HttpAdapterExtraLogUtil { - + public static final int MAX_HEADER_VALUE_SIZE = 400; + public static final String BODY_FIELD_NAME = "eapim-adapter-send-body"; static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); public static boolean isHttpHeaderMode() { @@ -62,14 +63,19 @@ public class HttpAdapterExtraLogUtil { httpAdapterExtraLogVo.setHttpMethod(httpMethod); for (HttpAdapterExtraHeaderVo httpAdapterExtraHeaderVo : headerVoList) { - +// String name = httpAdapterExtraHeaderVo.getName(); +// if(StringUtils.isNotBlank(name) && "authorization".equals(name.toLowerCase())) { +// httpAdapterExtraHeaderVo.setValue("{hidden}"); +// } String value = httpAdapterExtraHeaderVo.getValue(); - - if (value == null) { - httpAdapterExtraHeaderVo.setValue(" "); - } - + if(StringUtils.isNotBlank(value) && value.length() > MAX_HEADER_VALUE_SIZE) { + value = value.substring(0, 400) + "..."; + httpAdapterExtraHeaderVo.setValue(value); + }else if(value == null){ + httpAdapterExtraHeaderVo.setValue(" "); + } } + httpAdapterExtraLogVo.setHeaderList(headerVoList); httpAdapterExtraLogVo.setHttpStatus(httpStatus); diff --git a/src/main/java/com/eactive/eai/common/util/RestSendBodyLogUtils.java b/src/main/java/com/eactive/eai/common/util/RestSendBodyLogUtils.java new file mode 100644 index 0000000..62f66ca --- /dev/null +++ b/src/main/java/com/eactive/eai/common/util/RestSendBodyLogUtils.java @@ -0,0 +1,49 @@ +package com.eactive.eai.common.util; + +import org.apache.commons.lang3.StringUtils; + +import com.eactive.eai.common.property.PropManager; +import com.eactive.eai.common.util.HttpAdapterExtraLogUtil; + +public class RestSendBodyLogUtils { + + private static final String PROP_LOG_MAX_DATA_SIZE = "log.max.data.size"; + private static final String PROP_GROUP = "RestSendBodyLog"; + + private RestSendBodyLogUtils() { + throw new IllegalStateException("Utility class"); + } + + /** + * API ID 별 어댑터 body 로그 남기는 지 여부 + * + * @param apiId + * @return + */ + public static boolean isBodyLoggingApi(String apiId) { + if (StringUtils.isEmpty(apiId)) + return false; + + String logging = PropManager.getInstance().getProperty(PROP_GROUP, apiId, "N"); + return StringUtils.equals("Y", logging); + } + + /** + * body 로그에 남길 만큼 자르기 + * + * @param body + * @return + */ + public static String getBodyByMaxSize(String body) { + String maxDataSize = PropManager.getInstance().getProperty(PROP_GROUP, PROP_LOG_MAX_DATA_SIZE); + int imaxDataSize = HttpAdapterExtraLogUtil.MAX_HEADER_VALUE_SIZE; + if (maxDataSize != null) + imaxDataSize = Integer.parseInt(maxDataSize); + + if (body.length() > imaxDataSize) + return StringUtils.substring(body, 0, imaxDataSize) + "..."; + + return body; + } + +} diff --git a/src/main/java/com/eactive/eai/outbound/RESTProcess.java b/src/main/java/com/eactive/eai/outbound/RESTProcess.java index 838879b..6e651f6 100644 --- a/src/main/java/com/eactive/eai/outbound/RESTProcess.java +++ b/src/main/java/com/eactive/eai/outbound/RESTProcess.java @@ -98,6 +98,10 @@ public class RESTProcess extends HTTPProcess { this.timeout = iTimeoutValue * 1000; this.tempProp.put(INTERFACE_TIME_OUT, "" + this.timeout); + this.tempProp.put("API_SERVICE_CODE", this.reqEaiMsg.getEAISvcCd()); + this.tempProp.put("OUT_REQ_EAI_MSG", this.reqEaiMsg); + this.tempProp.put("OUT_REQ_STD_MSG", this.reqEaiMsg.getStandardMessage()); + try { // API별 이용 String apiId = reqEaiMsg.getEAISvcCd();