Catalog alignment
[sdc.git] / common-app-logging / 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.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;
15
16 import javax.servlet.http.HttpServletRequest;
17 import java.util.Arrays;
18 import java.util.List;
19 import java.util.UUID;
20
21
22 /**
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.
26  */
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";
32
33     LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) {
34         this.ecompLogFieldsHandler = ecompLogFieldsHandler;
35         this.myMarker = marker;
36         this.myLogger = logger;
37         setKeyRequestIdIfNotSetYet();
38     }
39
40     public static String generateKeyRequestId() {
41         return UUID.randomUUID().toString();
42     }
43
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());
51     }
52
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);
59     }
60
61     protected void setKeyRequestIdIfNotSetYet() {
62         if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
63             setKeyRequestId(LoggingThreadLocalsHolder.getUuid());
64         }
65     }
66
67     private void validateMandatoryFields(String originMsg) {
68         // this method only checks if the mandatory fields have been initialized
69         String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
70
71         if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
72             myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
73                     String.format(missingLogFieldsMsg, filedNameThatHasNotBeenInitialized, originMsg));
74         }
75     }
76
77     @VisibleForTesting
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(" ");
84             }
85         });
86         return missingFields.toString();
87     }
88
89     public abstract List<String> getMandatoryFields();
90
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();
95     }
96
97     @Override
98     public void log(LogLevel logLevel, String message) {
99         log(logLevel, message, (Object) null);
100     }
101
102     @Override
103     public void log(Marker marker, LogLevel logLevel, String message) {
104         log(marker, logLevel, message, (Object) null);
105     }
106
107     @Override
108     public void log(LogLevel logLevel, String message, Object...params) {
109         validateMandatoryFields(message);
110
111         switch(logLevel) {
112             case ERROR:
113             case FATAL:  //TODO check how to log "FATAL" word
114                 myLogger.error(myMarker, message, params);
115                 break;
116             case WARN:
117                 myLogger.warn(myMarker, message, params);
118                 break;
119             case INFO:
120                 myLogger.info(myMarker, message, params);
121                 break;
122             case DEBUG:
123                 myLogger.debug(myMarker, message, params);
124                 break;
125             case TRACE:
126                 myLogger.trace(myMarker, message, params);
127                 break;
128             default:
129                 break;
130         }
131     }
132
133     @Override
134     public void log(LogLevel logLevel, String message, Throwable throwable) {
135         validateMandatoryFields(message);
136
137         switch(logLevel) {
138             case ERROR:
139             case FATAL:  //TODO check how to log "FATAL" word
140                 myLogger.error(myMarker, createErrorMessage(message, throwable));
141                 break;
142             case WARN:
143                 myLogger.warn(myMarker, createErrorMessage(message, throwable));
144                 break;
145             case INFO:
146                 myLogger.info(myMarker, createErrorMessage(message, throwable));
147                 break;
148             case DEBUG:
149                 myLogger.debug(myMarker, message, throwable);
150                 break;
151             case TRACE:
152                 myLogger.trace(myMarker, message, throwable);
153                 break;
154             default:
155                 break;
156         }
157     }
158
159     @Override
160     public void log(Marker marker, LogLevel logLevel, String message, Object...params) {
161         validateMandatoryFields(message);
162
163         switch(logLevel) {
164             case ERROR:
165             case FATAL:  //TODO check how to log "FATAL" word
166                 myLogger.error(marker, message, params);
167                 break;
168             case WARN:
169                 myLogger.warn(marker, message, params);
170                 break;
171             case INFO:
172                 myLogger.info(marker, message, params);
173                 break;
174             case DEBUG:
175                 myLogger.debug(marker, message, params);
176                 break;
177             case TRACE:
178                 myLogger.trace(marker, message, params);
179                 break;
180             default:
181                 break;
182         }
183     }
184
185     protected String createErrorMessage(String message, Throwable throwable) {
186         return String.format("%s: %s", message, throwable.getLocalizedMessage());
187     }
188
189
190     @Override
191     public ILogger clear() {
192         ecompLogFieldsHandler.clear();
193         return this;
194     }
195
196     @Override
197     public ILogger setKeyRequestId(String keyRequestId) {
198         ecompLogFieldsHandler.setKeyRequestId(keyRequestId);
199         return this;
200     }
201
202
203     @Override
204     public ILogger setKeyInvocationId(String keyInvocationId) {
205         ecompLogFieldsHandler.setKeyInvocationId(keyInvocationId);
206         return this;
207     }
208
209
210 }