From c2e03cb65ddca44c66616b2fd32455866c5eafa5 Mon Sep 17 00:00:00 2001 From: mojahidi Date: Wed, 18 Jul 2018 15:14:50 +0530 Subject: Add Logging support for WF Reverted changes of application.properties Added logging supprt for workflow application Change-Id: Ibdefa1f2bb42c4182821a95f130a7c3f3a01a7d9 Issue-ID: SDC-1530 Signed-off-by: mojahidi --- workflow/workflow-designer-be/pom.xml | 6 + .../sdc/workflow/logging/LoggingInterceptor.java | 40 +++++ .../workflow/logging/config/InterceptorConfig.java | 19 +++ .../sdc/workflow/logging/utils/LoggingUtils.java | 87 +++++++++++ .../onap/sdc/workflow/logging/utils/Status.java | 57 +++++++ .../src/main/resources/logback.xml | 167 +++++++++++++++++++++ 6 files changed, 376 insertions(+) create mode 100644 workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/LoggingInterceptor.java create mode 100644 workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/config/InterceptorConfig.java create mode 100644 workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/LoggingUtils.java create mode 100644 workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/Status.java create mode 100644 workflow/workflow-designer-be/src/main/resources/logback.xml diff --git a/workflow/workflow-designer-be/pom.xml b/workflow/workflow-designer-be/pom.xml index b76dc467..3a88d4c0 100644 --- a/workflow/workflow-designer-be/pom.xml +++ b/workflow/workflow-designer-be/pom.xml @@ -73,6 +73,12 @@ springfox-swagger2 ${springfox.version} + + org.openecomp.sdc + openecomp-sdc-logging-core + ${onap.version} + runtime + org.openecomp.sdc openecomp-sdc-versioning-api diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/LoggingInterceptor.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/LoggingInterceptor.java new file mode 100644 index 00000000..f5731125 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/LoggingInterceptor.java @@ -0,0 +1,40 @@ +package org.onap.sdc.workflow.logging; + +import org.onap.sdc.workflow.logging.utils.LoggingUtils; +import org.openecomp.sdc.logging.api.LoggingContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Component +public class LoggingInterceptor extends HandlerInterceptorAdapter { + + @Autowired + LoggingUtils loggingUtils; + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, + @Nullable Exception ex) throws Exception { + if (!(response instanceof ContentCachingResponseWrapper)) { + response = new ContentCachingResponseWrapper(response); + } + try { + loggingUtils.logResponse(request, response); + } finally { + LoggingContext.clear(); + } + } + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object object) throws Exception { + request.setAttribute(LoggingUtils.START_TIME_KEY, System.currentTimeMillis()); + loggingUtils.logRequest(request); + return true; + } + +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/config/InterceptorConfig.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/config/InterceptorConfig.java new file mode 100644 index 00000000..a7d46171 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/config/InterceptorConfig.java @@ -0,0 +1,19 @@ +package org.onap.sdc.workflow.logging.config; + +import org.onap.sdc.workflow.logging.LoggingInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + + @Autowired + LoggingInterceptor loggingInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(loggingInterceptor); + } +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/LoggingUtils.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/LoggingUtils.java new file mode 100644 index 00000000..10e4fb7e --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/LoggingUtils.java @@ -0,0 +1,87 @@ +package org.onap.sdc.workflow.logging.utils; + +import org.openecomp.sdc.logging.api.AuditData; +import org.openecomp.sdc.logging.api.ContextData; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.api.LoggingContext; +import org.openecomp.sdc.logging.api.StatusCode; +import org.openecomp.sdc.logging.servlet.HttpHeader; +import org.springframework.stereotype.Component; +import org.openecomp.sdc.logging.api.Logger; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.UUID; + +import static org.openecomp.sdc.logging.LoggingConstants.DEFAULT_PARTNER_NAME_HEADER; +import static org.openecomp.sdc.logging.LoggingConstants.DEFAULT_REQUEST_ID_HEADER; +import static org.openecomp.sdc.logging.api.StatusCode.COMPLETE; +import static org.openecomp.sdc.logging.api.StatusCode.ERROR; + +@Component +public class LoggingUtils { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + public static final String START_TIME_KEY = "audit.start.time"; + private HttpHeader requestIdHeader = new HttpHeader(DEFAULT_REQUEST_ID_HEADER); + private HttpHeader partnerNameHeader = new HttpHeader(DEFAULT_PARTNER_NAME_HEADER); + + public void logResponse(HttpServletRequest request, HttpServletResponse response) { + writeAudit(request, response); + } + + private StatusCode getStatusCode(HttpServletResponse response) { + return isSuccess(response.getStatus()) ? COMPLETE : ERROR; + } + + private String getReasonPhrase(int code) { + return Status.getReason(code); + } + + private long getStartTime(HttpServletRequest request) { + return Long.class.cast(request.getAttribute(START_TIME_KEY)); + } + public void logRequest(HttpServletRequest request) { + LoggingContext.clear(); + ContextData.ContextDataBuilder contextData = ContextData.builder(); + contextData.serviceName(createServiceName(request)); + + String partnerName = partnerNameHeader.getAny(request::getHeader); + if (partnerName != null) { + contextData.partnerName(partnerName); + } + + String requestId = requestIdHeader.getAny(request::getHeader); + contextData.requestId(requestId == null ? UUID.randomUUID().toString() : requestId); + + LoggingContext.put(contextData.build()); + } + + private String createServiceName(HttpServletRequest request) { + return request.getMethod() + " " + request.getServletPath(); + } + + private void writeAudit(HttpServletRequest request, + HttpServletResponse response) { + + if (!logger.isAuditEnabled()) { + return; + } + + long start = getStartTime(request); + long end = System.currentTimeMillis(); + + int responseCode = response.getStatus(); + StatusCode statusCode = getStatusCode(response); + AuditData auditData = AuditData.builder() + .startTime(start) + .endTime(end) + .statusCode(statusCode) + .responseCode(Integer.toString(responseCode)) + .responseDescription(getReasonPhrase(responseCode)) + .clientIpAddress(request.getRemoteAddr()).build(); + logger.audit(auditData); + } + + private boolean isSuccess(int responseCode) { + return responseCode > 199 && responseCode < 400; + } +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/Status.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/Status.java new file mode 100644 index 00000000..07ca8725 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/logging/utils/Status.java @@ -0,0 +1,57 @@ +package org.onap.sdc.workflow.logging.utils; + +public enum Status { + OK(200, "OK"), + CREATED(201, "Created"), + ACCEPTED(202, "Accepted"), + NO_CONTENT(204, "No Content"), + RESET_CONTENT(205, "Reset Content"), + PARTIAL_CONTENT(206, "Partial Content"), + MOVED_PERMANENTLY(301, "Moved Permanently"), + FOUND(302, "Found"), + SEE_OTHER(303, "See Other"), + NOT_MODIFIED(304, "Not Modified"), + USE_PROXY(305, "Use Proxy"), + TEMPORARY_REDIRECT(307, "Temporary Redirect"), + BAD_REQUEST(400, "Bad Request"), + UNAUTHORIZED(401, "Unauthorized"), + PAYMENT_REQUIRED(402, "Payment Required"), + FORBIDDEN(403, "Forbidden"), + NOT_FOUND(404, "Not Found"), + METHOD_NOT_ALLOWED(405, "Method Not Allowed"), + NOT_ACCEPTABLE(406, "Not Acceptable"), + PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"), + REQUEST_TIMEOUT(408, "Request Timeout"), + CONFLICT(409, "Conflict"), + GONE(410, "Gone"), + LENGTH_REQUIRED(411, "Length Required"), + PRECONDITION_FAILED(412, "Precondition Failed"), + REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"), + REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"), + UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"), + REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested Range Not Satisfiable"), + EXPECTATION_FAILED(417, "Expectation Failed"), + INTERNAL_SERVER_ERROR(500, "Internal Server Error"), + NOT_IMPLEMENTED(501, "Not Implemented"), + BAD_GATEWAY(502, "Bad Gateway"), + SERVICE_UNAVAILABLE(503, "Service Unavailable"), + GATEWAY_TIMEOUT(504, "Gateway Timeout"), + HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version Not Supported"); + + private final int code; + private final String reason; + + Status(int statusCode, String reasonPhrase) { + this.code = statusCode; + this.reason = reasonPhrase; + } + + public static String getReason(int code) { + for(Status status : Status.values()) { + if(status.code == code) + return status.reason; + } + return null; + } + +} diff --git a/workflow/workflow-designer-be/src/main/resources/logback.xml b/workflow/workflow-designer-be/src/main/resources/logback.xml new file mode 100644 index 00000000..6f33b864 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/resources/logback.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + ${log.location}/error.log + + + INFO + + + + + AUDIT + + NEUTRAL + DENY + + + + + METRICS + + NEUTRAL + DENY + + + + ${log.location}/error.log.%i + + 1 + 10 + + + + 20MB + + + + + %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread||%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%level||%X{ErrorCode}|%X{ErrorDescription}|%msg%n + + + + + + + + ${log.location}/debug.log + + + DEBUG + ACCEPT + DENY + + + + ${log.location}/debug.log.%i + + 1 + 10 + + + + 20MB + + + + + %d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%msg%n + + + + + + + + + + + + ${log.location}/audit.log + + + + AUDIT + + DENY + ACCEPT + + + + ${log.location}/audit.log.%i + + 1 + 10 + + + + 20MB + + + + + %X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread||%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceId}|%level||%X{ServerIpAddress}|%X{ElapsedTime}|%X{Server}|%X{ClientIpAddress}||||||||%msg%n + + + + + + + ${log.location}/metrics.log + + + + METRICS + + DENY + ACCEPT + + + + ${log.location}/metrics.log.%i + + 1 + 10 + + + + 20MB + + + + + %X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread||%X{ServiceName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceId}|%level||%X{ServerIpAddress}|%X{ElapsedTime}|%X{Server}|%X{ClientIpAddress}||||||||||%msg%n + + + + + + + %X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread||%X{ServiceName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceId}|%level||%X{ServerIpAddress}|%X{ElapsedTime}|%X{Server}|%X{ClientIpAddress}||||||||||%msg%n + + + + + + + + + + + + + + + \ No newline at end of file -- cgit 1.2.3-korg