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.openecomp.sdc.common.log.api.ILogFieldsHandler;
6 import org.openecomp.sdc.common.log.api.ILogger;
7 import org.openecomp.sdc.common.log.enums.LogLevel;
8 import org.openecomp.sdc.common.log.enums.LogMarkers;
9 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
10 import org.slf4j.Logger;
11 import org.slf4j.Marker;
12 import org.slf4j.MarkerFactory;
14 import java.util.Arrays;
15 import java.util.List;
19 * Created by mm288v on 12/27/2017.
20 * This class holds the common behavior of all Loger-Typed classes.
21 * The Concrete loggers shoudl derive from this one.
23 public abstract class LoggerBase implements ILogger {
24 private final Logger myLogger;
25 private final Marker myMarker;
26 protected final ILogFieldsHandler ecompLogFieldsHandler;
27 private final static String missingLogFieldsMsg = "mandatory parameters for ECOMP logging, missing fields: %s, original message: %s";
29 LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) {
30 this.ecompLogFieldsHandler = ecompLogFieldsHandler;
31 this.myMarker = marker;
32 this.myLogger = logger;
33 setKeyRequestIdIfNotSetYet();
36 protected void setKeyRequestIdIfNotSetYet() {
37 if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
38 setKeyRequestId(ThreadLocalsHolder.getUuid());
41 private void validateMandatoryFields(String originMsg) {
42 // this method only checks if the mandatory fields have been initialized
43 String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
45 if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
46 myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
47 String.format(missingLogFieldsMsg, filedNameThatHasNotBeenInitialized, originMsg));
52 String checkMandatoryFieldsExistInMDC() {
53 // this method returns a String of uninitialised fields
54 StringBuilder missingFields = new StringBuilder();
55 getMandatoryFields().forEach(field -> {
56 if (ecompLogFieldsHandler.isMDCParamEmpty(field)) {
57 missingFields.append(field).append(" ");
60 return missingFields.toString();
63 public abstract List<String> getMandatoryFields();
65 protected String convertExceptionStackToString(Exception ex) {
66 StringBuilder stackTrack = new StringBuilder();
67 Arrays.asList(ex.getStackTrace()).forEach(item -> stackTrack.append(item.toString()).append("\n"));
68 return stackTrack.toString();
72 public void log(LogLevel logLevel, String message) {
73 log(logLevel, message, (Object) null);
77 public void log(LogLevel logLevel, String message, Object...params) {
78 validateMandatoryFields(message);
82 case FATAL: //TODO check how to log "FATAL" word
83 myLogger.error(myMarker, message, params);
86 myLogger.warn(myMarker, message, params);
89 myLogger.info(myMarker, message, params);
92 myLogger.debug(myMarker, message, params);
95 myLogger.trace(myMarker, message, params);
103 public void log(LogLevel logLevel, String message, Throwable throwable) {
104 validateMandatoryFields(message);
108 case FATAL: //TODO check how to log "FATAL" word
109 myLogger.error(myMarker, createErrorMessage(message, throwable));
112 myLogger.warn(myMarker, createErrorMessage(message, throwable));
115 myLogger.info(myMarker, createErrorMessage(message, throwable));
118 myLogger.debug(myMarker, message, throwable);
121 myLogger.trace(myMarker, message, throwable);
128 protected String createErrorMessage(String message, Throwable throwable) {
129 return String.format("%s: %s", message, throwable.getLocalizedMessage());
134 public ILogger clear() {
135 ecompLogFieldsHandler.clear();
140 public ILogger setKeyRequestId(String keyRequestId) {
141 ecompLogFieldsHandler.setKeyRequestId(keyRequestId);