re base code
[sdc.git] / common-app-api / src / main / java / org / openecomp / sdc / common / log / elements / LoggerBase.java
1 package org.openecomp.sdc.common.log.elements;
2
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;
13
14 import java.util.Arrays;
15 import java.util.List;
16
17
18 /**
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.
22  */
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";
28
29     LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) {
30         this.ecompLogFieldsHandler = ecompLogFieldsHandler;
31         this.myMarker = marker;
32         this.myLogger = logger;
33         setKeyRequestIdIfNotSetYet();
34     }
35
36     protected void setKeyRequestIdIfNotSetYet() {
37         if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
38             setKeyRequestId(ThreadLocalsHolder.getUuid());
39         }
40     }
41     private void validateMandatoryFields(String originMsg) {
42         // this method only checks if the mandatory fields have been initialized
43         String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
44
45         if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
46             myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
47                     String.format(missingLogFieldsMsg, filedNameThatHasNotBeenInitialized, originMsg));
48         }
49     }
50
51     @VisibleForTesting
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(" ");
58             }
59         });
60         return missingFields.toString();
61     }
62
63     public abstract List<String> getMandatoryFields();
64
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();
69     }
70
71     @Override
72     public void log(LogLevel logLevel, String message) {
73         log(logLevel, message, (Object) null);
74     }
75
76     @Override
77     public void log(LogLevel logLevel, String message, Object...params) {
78         validateMandatoryFields(message);
79
80         switch(logLevel) {
81             case ERROR:
82             case FATAL:  //TODO check how to log "FATAL" word
83                 myLogger.error(myMarker, message, params);
84                 break;
85             case WARN:
86                 myLogger.warn(myMarker, message, params);
87                 break;
88             case INFO:
89                 myLogger.info(myMarker, message, params);
90                 break;
91             case DEBUG:
92                 myLogger.debug(myMarker, message, params);
93                 break;
94             case TRACE:
95                 myLogger.trace(myMarker, message, params);
96                 break;
97             default:
98                 break;
99         }
100     }
101
102     @Override
103     public void log(LogLevel logLevel, String message, Throwable throwable) {
104         validateMandatoryFields(message);
105
106         switch(logLevel) {
107             case ERROR:
108             case FATAL:  //TODO check how to log "FATAL" word
109                 myLogger.error(myMarker, createErrorMessage(message, throwable));
110                 break;
111             case WARN:
112                 myLogger.warn(myMarker, createErrorMessage(message, throwable));
113                 break;
114             case INFO:
115                 myLogger.info(myMarker, createErrorMessage(message, throwable));
116                 break;
117             case DEBUG:
118                 myLogger.debug(myMarker, message, throwable);
119                 break;
120             case TRACE:
121                 myLogger.trace(myMarker, message, throwable);
122                 break;
123             default:
124                 break;
125         }
126     }
127
128     protected String createErrorMessage(String message, Throwable throwable) {
129         return String.format("%s: %s", message, throwable.getLocalizedMessage());
130     }
131
132
133     @Override
134     public ILogger clear() {
135         ecompLogFieldsHandler.clear();
136         return this;
137     }
138
139     @Override
140     public ILogger setKeyRequestId(String keyRequestId) {
141         ecompLogFieldsHandler.setKeyRequestId(keyRequestId);
142         return this;
143     }
144
145 }