2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.common.log.elements;
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;
34 import java.util.Arrays;
35 import java.util.List;
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.
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";
49 LoggerBase(ILogFieldsHandler ecompLogFieldsHandler, Marker marker, Logger logger) {
50 this.ecompLogFieldsHandler = ecompLogFieldsHandler;
51 this.myMarker = marker;
52 this.myLogger = logger;
53 setKeyRequestIdIfNotSetYet();
56 void setKeyRequestIdIfNotSetYet() {
57 if (StringUtils.isEmpty(ecompLogFieldsHandler.getKeyRequestId())) {
58 setKeyRequestId(ThreadLocalsHolder.getUuid());
62 private void validateMandatoryFields(String originMsg) {
63 // this method only checks if the mandatory fields have been initialized
64 String filedNameThatHasNotBeenInitialized = checkMandatoryFieldsExistInMDC();
66 if (myLogger.isDebugEnabled() && !"".equalsIgnoreCase(filedNameThatHasNotBeenInitialized)) {
67 myLogger.debug(MarkerFactory.getMarker(LogMarkers.DEBUG_MARKER.text()),
68 String.format(MISSING_LOG_FIELDS_MESSAGE, filedNameThatHasNotBeenInitialized, originMsg));
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(" ");
81 return missingFields.toString();
84 public abstract List<String> getMandatoryFields();
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();
93 public void log(LogLevel logLevel, String message) {
94 log(logLevel, message, (Object) null);
98 public void log(LogLevel logLevel, String message, Object... params) {
99 validateMandatoryFields(message);
103 case FATAL: //TODO check how to log "FATAL" word
104 myLogger.error(myMarker, message, params);
107 myLogger.warn(myMarker, message, params);
110 myLogger.info(myMarker, message, params);
113 myLogger.debug(myMarker, message, params);
116 myLogger.trace(myMarker, message, params);
124 public void log(LogLevel logLevel, String message, Throwable throwable) {
125 validateMandatoryFields(message);
129 case FATAL: //TODO check how to log "FATAL" word
130 myLogger.error(myMarker, createErrorMessage(message, throwable));
133 myLogger.warn(myMarker, createErrorMessage(message, throwable));
136 myLogger.info(myMarker, createErrorMessage(message, throwable));
139 myLogger.debug(myMarker, message, throwable);
142 myLogger.trace(myMarker, message, throwable);
149 String createErrorMessage(String message, Throwable throwable) {
150 return String.format("%s: %s", message, throwable.getLocalizedMessage());
155 public ILogger clear() {
156 ecompLogFieldsHandler.clear();
161 public ILogger setKeyRequestId(String keyRequestId) {
162 ecompLogFieldsHandler.setKeyRequestId(keyRequestId);