CSIT Fix for SDC-2585
[sdc.git] / common-app-api / src / main / java / org / openecomp / sdc / common / log / elements / LoggerBase.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.common.log.elements;
22
23 import com.google.common.annotations.VisibleForTesting;
24 import org.apache.commons.lang3.StringUtils;
25 import org.openecomp.sdc.common.log.api.ILogFieldsHandler;
26 import org.openecomp.sdc.common.log.api.ILogger;
27 import org.openecomp.sdc.common.log.enums.LogLevel;
28 import org.openecomp.sdc.common.log.enums.LogMarkers;
29 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
30 import org.slf4j.Logger;
31 import org.slf4j.Marker;
32 import org.slf4j.MarkerFactory;
33
34 import java.util.Arrays;
35 import java.util.List;
36
37
38 /**
39  * Created by mm288v on 12/27/2017.
40  * This class holds the common behavior of all Loger-Typed classes.
41  * The Concrete loggers shoudl derive from this one.
42  */
43 public abstract class LoggerBase implements ILogger {
44     private final Logger myLogger;
45     private final Marker myMarker;
46     final ILogFieldsHandler ecompLogFieldsHandler;
47     private static final String MISSING_LOG_FIELDS_MESSAGE = "mandatory parameters for ECOMP logging, missing fields: %s, original message: %s";
48
49     LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) {
50         this.ecompLogFieldsHandler = ecompLogFieldsHandler;
51         this.myMarker = marker;
52         this.myLogger = logger;
53         setKeyRequestIdIfNotSetYet();
54     }
55
56     void setKeyRequestIdIfNotSetYet() {
57         if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
58             setKeyRequestId(ThreadLocalsHolder.getUuid());
59         }
60     }
61
62     private void validateMandatoryFields(String originMsg) {
63         // this method only checks if the mandatory fields have been initialized
64         String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
65
66         if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
67             myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
68                     String.format(MISSING_LOG_FIELDS_MESSAGE, filedNameThatHasNotBeenInitialized, originMsg));
69         }
70     }
71
72     @VisibleForTesting
73     String checkMandatoryFieldsExistInMDC() {
74         // this method returns a String of uninitialised fields
75         StringBuilder missingFields = new StringBuilder();
76         getMandatoryFields().forEach(field -> {
77             if (ecompLogFieldsHandler.isMDCParamEmpty(field)) {
78                 missingFields.append(field).append(" ");
79             }
80         });
81         return missingFields.toString();
82     }
83
84     public abstract List<String> getMandatoryFields();
85
86     protected String convertExceptionStackToString(Exception ex) {
87         StringBuilder stackTrack = new StringBuilder();
88         Arrays.asList(ex.getStackTrace()).forEach(item -> stackTrack.append(item.toString()).append("\n"));
89         return stackTrack.toString();
90     }
91
92     @Override
93     public void log(LogLevel logLevel, String message) {
94         log(logLevel, message, (Object) null);
95     }
96
97     @Override
98     public void log(LogLevel logLevel, String message, Object... params) {
99         validateMandatoryFields(message);
100
101         switch (logLevel) {
102             case ERROR:
103             case FATAL:  //TODO check how to log "FATAL" word
104                 myLogger.error(myMarker, message, params);
105                 break;
106             case WARN:
107                 myLogger.warn(myMarker, message, params);
108                 break;
109             case INFO:
110                 myLogger.info(myMarker, message, params);
111                 break;
112             case DEBUG:
113                 myLogger.debug(myMarker, message, params);
114                 break;
115             case TRACE:
116                 myLogger.trace(myMarker, message, params);
117                 break;
118             default:
119                 break;
120         }
121     }
122
123     @Override
124     public void log(LogLevel logLevel, String message, Throwable throwable) {
125         validateMandatoryFields(message);
126
127         switch (logLevel) {
128             case ERROR:
129             case FATAL:  //TODO check how to log "FATAL" word
130                 myLogger.error(myMarker, createErrorMessage(message, throwable));
131                 break;
132             case WARN:
133                 myLogger.warn(myMarker, createErrorMessage(message, throwable));
134                 break;
135             case INFO:
136                 myLogger.info(myMarker, createErrorMessage(message, throwable));
137                 break;
138             case DEBUG:
139                 myLogger.debug(myMarker, message, throwable);
140                 break;
141             case TRACE:
142                 myLogger.trace(myMarker, message, throwable);
143                 break;
144             default:
145                 break;
146         }
147     }
148
149     String createErrorMessage(String message, Throwable throwable) {
150         return String.format("%s: %s", message, throwable.getLocalizedMessage());
151     }
152
153
154     @Override
155     public ILogger clear() {
156         ecompLogFieldsHandler.clear();
157         return this;
158     }
159
160     @Override
161     public ILogger setKeyRequestId(String keyRequestId) {
162         ecompLogFieldsHandler.setKeyRequestId(keyRequestId);
163         return this;
164     }
165
166 }