1 package org.openecomp.sdc.common.log.elements;
3 import com.google.common.annotations.VisibleForTesting;
4 import org.apache.commons.lang3.StringUtils;
5 import org.onap.logging.ref.slf4j.ONAPLogConstants;
6 import org.openecomp.sdc.common.log.api.ILogFieldsHandler;
7 import org.openecomp.sdc.common.log.api.ILogger;
8 import org.openecomp.sdc.common.log.enums.ConstantsLogging;
9 import org.openecomp.sdc.common.log.enums.LogLevel;
10 import org.openecomp.sdc.common.log.enums.LogMarkers;
11 import org.openecomp.sdc.common.log.utils.LoggingThreadLocalsHolder;
12 import org.slf4j.Logger;
13 import org.slf4j.Marker;
14 import org.slf4j.MarkerFactory;
16 import javax.servlet.http.HttpServletRequest;
17 import java.util.Arrays;
18 import java.util.List;
19 import java.util.UUID;
23 * Created by mm288v on 12/27/2017.
24 * This class holds the common behavior of all Loger-Typed classes.
25 * The Concrete loggers shoudl derive from this one.
27 public abstract class LoggerBase implements ILogger {
28 private final Logger myLogger;
29 private final Marker myMarker;
30 protected final ILogFieldsHandler ecompLogFieldsHandler;
31 private final static String missingLogFieldsMsg = "mandatory parameters for ECOMP logging, missing fields: %s, original message: %s";
33 LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) {
34 this.ecompLogFieldsHandler = ecompLogFieldsHandler;
35 this.myMarker = marker;
36 this.myLogger = logger;
37 setKeyRequestIdIfNotSetYet();
40 public static String generateKeyRequestId() {
41 return UUID.randomUUID().toString();
44 public static String getRequestId(HttpServletRequest httpRequest) {
45 String onapRequestId = httpRequest.getHeader(ONAPLogConstants.Headers.REQUEST_ID);
46 String requestId = httpRequest.getHeader(ConstantsLogging.X_REQUEST_ID);
47 String transactionReId = httpRequest.getHeader(ConstantsLogging.X_TRANSACTION_ID_HEADER);
48 String ecompRequestId = httpRequest.getHeader(ConstantsLogging.X_ECOMP_REQUEST_ID_HEADER);
49 return Arrays.asList(onapRequestId, requestId, transactionReId, ecompRequestId).stream()
50 .filter(id -> !StringUtils.isEmpty(id)).findFirst().orElse(generateKeyRequestId());
53 public static String getPartnerName(HttpServletRequest httpRequest) {
54 String userId = httpRequest.getHeader(ConstantsLogging.USER_ID_HEADER);
55 String onapPartnerName = httpRequest.getHeader(ONAPLogConstants.Headers.PARTNER_NAME);
56 String reqUri = httpRequest.getHeader(ConstantsLogging.USER_AGENT_HEADER);
57 return Arrays.asList(userId, onapPartnerName, reqUri).stream()
58 .filter(pn-> !StringUtils.isEmpty(pn)).findFirst().orElse(ConstantsLogging.PartnerName_Unknown);
61 protected void setKeyRequestIdIfNotSetYet() {
62 if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
63 setKeyRequestId(LoggingThreadLocalsHolder.getUuid());
67 private void validateMandatoryFields(String originMsg) {
68 // this method only checks if the mandatory fields have been initialized
69 String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
71 if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
72 myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
73 String.format(missingLogFieldsMsg, filedNameThatHasNotBeenInitialized, originMsg));
78 String checkMandatoryFieldsExistInMDC() {
79 // this method returns a String of uninitialised fields
80 StringBuilder missingFields = new StringBuilder();
81 getMandatoryFields().forEach(field -> {
82 if (ecompLogFieldsHandler.isMDCParamEmpty(field)) {
83 missingFields.append(field).append(" ");
86 return missingFields.toString();
89 public abstract List<String> getMandatoryFields();
91 protected String convertExceptionStackToString(Exception ex) {
92 StringBuilder stackTrack = new StringBuilder();
93 Arrays.asList(ex.getStackTrace()).forEach(item -> stackTrack.append(item.toString()).append("\n"));
94 return stackTrack.toString();
98 public void log(LogLevel logLevel, String message) {
99 log(logLevel, message, (Object) null);
103 public void log(Marker marker, LogLevel logLevel, String message) {
104 log(marker, logLevel, message, (Object) null);
108 public void log(LogLevel logLevel, String message, Object...params) {
109 validateMandatoryFields(message);
113 case FATAL: //TODO check how to log "FATAL" word
114 myLogger.error(myMarker, message, params);
117 myLogger.warn(myMarker, message, params);
120 myLogger.info(myMarker, message, params);
123 myLogger.debug(myMarker, message, params);
126 myLogger.trace(myMarker, message, params);
134 public void log(LogLevel logLevel, String message, Throwable throwable) {
135 validateMandatoryFields(message);
139 case FATAL: //TODO check how to log "FATAL" word
140 myLogger.error(myMarker, createErrorMessage(message, throwable));
143 myLogger.warn(myMarker, createErrorMessage(message, throwable));
146 myLogger.info(myMarker, createErrorMessage(message, throwable));
149 myLogger.debug(myMarker, message, throwable);
152 myLogger.trace(myMarker, message, throwable);
160 public void log(Marker marker, LogLevel logLevel, String message, Object...params) {
161 validateMandatoryFields(message);
165 case FATAL: //TODO check how to log "FATAL" word
166 myLogger.error(marker, message, params);
169 myLogger.warn(marker, message, params);
172 myLogger.info(marker, message, params);
175 myLogger.debug(marker, message, params);
178 myLogger.trace(marker, message, params);
185 protected String createErrorMessage(String message, Throwable throwable) {
186 return String.format("%s: %s", message, throwable.getLocalizedMessage());
191 public ILogger clear() {
192 ecompLogFieldsHandler.clear();
197 public ILogger setKeyRequestId(String keyRequestId) {
198 ecompLogFieldsHandler.setKeyRequestId(keyRequestId);
204 public ILogger setKeyInvocationId(String keyInvocationId) {
205 ecompLogFieldsHandler.setKeyInvocationId(keyInvocationId);