diff options
Diffstat (limited to 'security-util-lib/src/main/java/org/onap/sdc/security/logging/elements/LoggerBase.java')
-rw-r--r-- | security-util-lib/src/main/java/org/onap/sdc/security/logging/elements/LoggerBase.java | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/security-util-lib/src/main/java/org/onap/sdc/security/logging/elements/LoggerBase.java b/security-util-lib/src/main/java/org/onap/sdc/security/logging/elements/LoggerBase.java new file mode 100644 index 0000000..4e3d30f --- /dev/null +++ b/security-util-lib/src/main/java/org/onap/sdc/security/logging/elements/LoggerBase.java @@ -0,0 +1,230 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.sdc.security.logging.elements; + +import com.google.common.annotations.VisibleForTesting; +import org.apache.commons.lang3.StringUtils; +import org.onap.logging.ref.slf4j.ONAPLogConstants; +import org.onap.sdc.security.logging.api.ILogFieldsHandler; +import org.onap.sdc.security.logging.api.ILogger; +import org.onap.sdc.security.logging.enums.EcompHeadersConstants; +import org.onap.sdc.security.logging.enums.LogLevel; +import org.onap.sdc.security.logging.enums.LogMarkers; +import org.slf4j.Logger; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + + +public abstract class LoggerBase implements ILogger { + private final Logger myLogger; + private final Marker myMarker; + protected final ILogFieldsHandler ecompLogFieldsHandler; + private final static String missingLogFieldsMsg = "mandatory parameters for ECOMP logging, missing fields: %s, original message: %s"; + + LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) { + this.ecompLogFieldsHandler = ecompLogFieldsHandler; + this.myMarker = marker; + this.myLogger = logger; + setKeyRequestIdIfNotSetYet(); + } + + public static String generateKeyRequestId() { + return UUID.randomUUID().toString(); + } + + public static String getRequestId(HttpServletRequest httpRequest) { + String onapRequestId = httpRequest.getHeader(ONAPLogConstants.Headers.REQUEST_ID); + String requestId = httpRequest.getHeader(EcompHeadersConstants.X_REQUEST_ID); + String transactionReId = httpRequest.getHeader(EcompHeadersConstants.X_TRANSACTION_ID_HEADER); + String ecompRequestId = httpRequest.getHeader(EcompHeadersConstants.X_ECOMP_REQUEST_ID_HEADER); + return Arrays.asList(onapRequestId, requestId, transactionReId, ecompRequestId).stream() + .filter(id -> !StringUtils.isEmpty(id)).findFirst().orElse(generateKeyRequestId()); + } + + public static String getPartnerName(HttpServletRequest httpRequest) { + String userId = httpRequest.getHeader(EcompHeadersConstants.USER_ID_HEADER); + String onapPartnerName = httpRequest.getHeader(ONAPLogConstants.Headers.PARTNER_NAME); + String reqUri = httpRequest.getHeader(EcompHeadersConstants.USER_AGENT_HEADER); + return Arrays.asList(userId, onapPartnerName, reqUri).stream() + .filter(pn-> !StringUtils.isEmpty(pn)).findFirst().orElse(EcompHeadersConstants.PartnerName_Unknown); + } + + protected void setKeyRequestIdIfNotSetYet() { + if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) { + setKeyRequestId(generateKeyRequestId()); + } + } + + protected void setKeyInvocationIdIfNotSetYet() { + if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyInvocationId())) { + setKeyInvocationId("IDAN--setKeyInvocationIdIfNotSetYet"); + } + } + + private void validateMandatoryFields(String originMsg) { + // this method only checks if the mandatory fields have been initialized + String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC(); + + if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) { + myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()), + String.format(missingLogFieldsMsg, filedNameThatHasNotBeenInitialized, originMsg)); + } + } + + @VisibleForTesting + String checkMandatoryFieldsExistInMDC() { + // this method returns a String of uninitialised fields + StringBuilder missingFields = new StringBuilder(); + getMandatoryFields().forEach(field -> { + if (ecompLogFieldsHandler.isMDCParamEmpty(field)) { + missingFields.append(field).append(" "); + } + }); + return missingFields.toString(); + } + + public abstract List<String> getMandatoryFields(); + + protected String convertExceptionStackToString(Exception ex) { + StringBuilder stackTrack = new StringBuilder(); + Arrays.asList(ex.getStackTrace()).forEach(item -> stackTrack.append(item.toString()).append("\n")); + return stackTrack.toString(); + } + + @Override + public void log(LogLevel logLevel, String message) { + log(logLevel, message, (Object) null); + } + + @Override + public void log(Marker marker, LogLevel logLevel, String message) { + log(marker, logLevel, message, (Object) null); + } + + @Override + public void log(LogLevel logLevel, String message, Object...params) { + validateMandatoryFields(message); + + switch(logLevel) { + case ERROR: + case FATAL: //TODO check how to log "FATAL" word + myLogger.error(myMarker, message, params); + break; + case WARN: + myLogger.warn(myMarker, message, params); + break; + case INFO: + myLogger.info(myMarker, message, params); + break; + case DEBUG: + myLogger.debug(myMarker, message, params); + break; + case TRACE: + myLogger.trace(myMarker, message, params); + break; + default: + break; + } + } + + @Override + public void log(LogLevel logLevel, String message, Throwable throwable) { + validateMandatoryFields(message); + + switch(logLevel) { + case ERROR: + case FATAL: //TODO check how to log "FATAL" word + myLogger.error(myMarker, createErrorMessage(message, throwable)); + break; + case WARN: + myLogger.warn(myMarker, createErrorMessage(message, throwable)); + break; + case INFO: + myLogger.info(myMarker, createErrorMessage(message, throwable)); + break; + case DEBUG: + myLogger.debug(myMarker, message, throwable); + break; + case TRACE: + myLogger.trace(myMarker, message, throwable); + break; + default: + break; + } + } + + @Override + public void log(Marker marker, LogLevel logLevel, String message, Object...params) { + validateMandatoryFields(message); + + switch(logLevel) { + case ERROR: + case FATAL: //TODO check how to log "FATAL" word + myLogger.error(marker, message, params); + break; + case WARN: + myLogger.warn(marker, message, params); + break; + case INFO: + myLogger.info(marker, message, params); + break; + case DEBUG: + myLogger.debug(marker, message, params); + break; + case TRACE: + myLogger.trace(marker, message, params); + break; + default: + break; + } + } + + protected String createErrorMessage(String message, Throwable throwable) { + return String.format("%s: %s", message, throwable.getLocalizedMessage()); + } + + + @Override + public ILogger clear() { + ecompLogFieldsHandler.clear(); + return this; + } + + @Override + public ILogger setKeyRequestId(String keyRequestId) { + ecompLogFieldsHandler.setKeyRequestId(keyRequestId); + return this; + } + + + @Override + public ILogger setKeyInvocationId(String keyInvocationId) { + ecompLogFieldsHandler.setKeyInvocationId(keyInvocationId); + return this; + } + + +} |