Added oparent to sdc main
[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     protected final ILogFieldsHandler ecompLogFieldsHandler;
47     private final static String missingLogFieldsMsg = "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     protected void setKeyRequestIdIfNotSetYet() {
57         if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
58             setKeyRequestId(ThreadLocalsHolder.getUuid());
59         }
60     }
61     private void validateMandatoryFields(String originMsg) {
62         // this method only checks if the mandatory fields have been initialized
63         String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
64
65         if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
66             myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
67                     String.format(missingLogFieldsMsg, filedNameThatHasNotBeenInitialized, originMsg));
68         }
69     }
70
71     @VisibleForTesting
72     String checkMandatoryFieldsExistInMDC() {
73         // this method returns a String of uninitialised fields
74         StringBuilder missingFields = new StringBuilder();
75         getMandatoryFields().forEach(field -> {
76             if (ecompLogFieldsHandler.isMDCParamEmpty(field)) {
77                 missingFields.append(field).append(" ");
78             }
79         });
80         return missingFields.toString();
81     }
82
83     public abstract List<String> getMandatoryFields();
84
85     protected String convertExceptionStackToString(Exception ex) {
86         StringBuilder stackTrack = new StringBuilder();
87         Arrays.asList(ex.getStackTrace()).forEach(item -> stackTrack.append(item.toString()).append("\n"));
88         return stackTrack.toString();
89     }
90
91     @Override
92     public void log(LogLevel logLevel, String message) {
93         log(logLevel, message, (Object) null);
94     }
95
96     @Override
97     public void log(LogLevel logLevel, String message, Object...params) {
98         validateMandatoryFields(message);
99
100         switch(logLevel) {
101             case ERROR:
102             case FATAL:  //TODO check how to log "FATAL" word
103                 myLogger.error(myMarker, message, params);
104                 break;
105             case WARN:
106                 myLogger.warn(myMarker, message, params);
107                 break;
108             case INFO:
109                 myLogger.info(myMarker, message, params);
110                 break;
111             case DEBUG:
112                 myLogger.debug(myMarker, message, params);
113                 break;
114             case TRACE:
115                 myLogger.trace(myMarker, message, params);
116                 break;
117             default:
118                 break;
119         }
120     }
121
122     @Override
123     public void log(LogLevel logLevel, String message, Throwable throwable) {
124         validateMandatoryFields(message);
125
126         switch(logLevel) {
127             case ERROR:
128             case FATAL:  //TODO check how to log "FATAL" word
129                 myLogger.error(myMarker, createErrorMessage(message, throwable));
130                 break;
131             case WARN:
132                 myLogger.warn(myMarker, createErrorMessage(message, throwable));
133                 break;
134             case INFO:
135                 myLogger.info(myMarker, createErrorMessage(message, throwable));
136                 break;
137             case DEBUG:
138                 myLogger.debug(myMarker, message, throwable);
139                 break;
140             case TRACE:
141                 myLogger.trace(myMarker, message, throwable);
142                 break;
143             default:
144                 break;
145         }
146     }
147
148     protected String createErrorMessage(String message, Throwable throwable) {
149         return String.format("%s: %s", message, throwable.getLocalizedMessage());
150     }
151
152
153     @Override
154     public ILogger clear() {
155         ecompLogFieldsHandler.clear();
156         return this;
157     }
158
159     @Override
160     public ILogger setKeyRequestId(String keyRequestId) {
161         ecompLogFieldsHandler.setKeyRequestId(keyRequestId);
162         return this;
163     }
164
165 }