<artifactId>utils-installer</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>org.onap.ccsdk.sli.core</groupId>
- <artifactId>sli-recording</artifactId>
- <version>${project.version}</version>
- </dependency>
</dependencies>
</dependencyManagement>
--- /dev/null
+package org.onap.ccsdk.sli.core.sli;\r
+\r
+import org.onap.logging.ref.slf4j.ONAPLogConstants;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.slf4j.MDC;\r
+\r
+public class ErrorLogger {\r
+ public static final int ERROR_CODE_100 = 100;\r
+ public static final int ERROR_CODE_200 = 200;\r
+ public static final int ERROR_CODE_300 = 300;\r
+ public static final int ERROR_CODE_400 = 400;\r
+ public static final int ERROR_CODE_500 = 500;\r
+ public static final int ERROR_CODE_900 = 900;\r
+\r
+ private static final String DEFAULT_100_DESCRIPTION = "Permission Error";\r
+ private static final String DEFAULT_200_DESCRIPTION = "Availability Error or Timeout";\r
+ private static final String DEFAULT_300_DESCRIPTION = "Data Error";\r
+ private static final String DEFAULT_400_DESCRIPTION = "Schema Error";\r
+ private static final String DEFAULT_500_DESCRIPTION = "Business Process Error";\r
+ private static final String DEFAULT_900_DESCRIPTION = "Unknown Error";\r
+ private Logger log;\r
+ \r
+ public ErrorLogger() {\r
+ this.log = LoggerFactory.getLogger(ErrorLogger.class);\r
+ }\r
+ \r
+ public ErrorLogger(Logger log) {\r
+ this.log = log; \r
+ }\r
+\r
+ public void logError(String message, int errorCode) {\r
+ createLogEntry(message, errorCode, null, null);\r
+ }\r
+\r
+ public void logError(String message, int errorCode, Exception e) {\r
+ createLogEntry(message, errorCode, null, e);\r
+ }\r
+\r
+ public void logError(String message, int errorCode, String description) {\r
+ createLogEntry(message, errorCode, description, null);\r
+ }\r
+\r
+ public void logError(String message, int errorCode, String description, Exception e) {\r
+ createLogEntry(message, errorCode, description, e);\r
+ }\r
+\r
+ public void createLogEntry(String message, int errorCode, String description, Exception e) {\r
+ //If the error code isn't valid default it to unknown error code\r
+ if(!isValidCode(errorCode)) {\r
+ errorCode = 900;\r
+ }\r
+ \r
+ MDC.put(ONAPLogConstants.MDCs.ERROR_CODE, String.valueOf(errorCode));\r
+\r
+ if (description == null || description.isEmpty()) {\r
+ description = getDefaultDescription(errorCode);\r
+ }\r
+\r
+ MDC.put(ONAPLogConstants.MDCs.ERROR_DESC, description);\r
+ if (e != null) {\r
+ log.error(message, e);\r
+ } else {\r
+ log.error(message);\r
+ }\r
+ clearKeys();\r
+ }\r
+\r
+ public boolean isValidCode(int errorCode) {\r
+ if (errorCode == ERROR_CODE_100 || errorCode == ERROR_CODE_200 || errorCode == ERROR_CODE_300 || errorCode == ERROR_CODE_400 || errorCode == ERROR_CODE_500\r
+ || errorCode == ERROR_CODE_900) {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ public String getDefaultDescription(int errorCode) {\r
+ if (errorCode == ERROR_CODE_100) {\r
+ return DEFAULT_100_DESCRIPTION;\r
+ }\r
+ if (errorCode == ERROR_CODE_200) {\r
+ return DEFAULT_200_DESCRIPTION;\r
+ }\r
+ if (errorCode == ERROR_CODE_300) {\r
+ return DEFAULT_300_DESCRIPTION;\r
+ }\r
+ if (errorCode == ERROR_CODE_400) {\r
+ return DEFAULT_400_DESCRIPTION;\r
+ }\r
+ if (errorCode == ERROR_CODE_500) {\r
+ return DEFAULT_500_DESCRIPTION;\r
+ }\r
+ return DEFAULT_900_DESCRIPTION;\r
+ }\r
+\r
+ public void clearKeys() {\r
+ MDC.remove(ONAPLogConstants.MDCs.ERROR_CODE);\r
+ MDC.remove(ONAPLogConstants.MDCs.ERROR_DESC);\r
+ }\r
+}\r
--- /dev/null
+package org.onap.ccsdk.sli.core.sli;\r
+\r
+import static org.junit.Assert.assertFalse;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import org.junit.Test;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+public class ErrorLoggerTest {\r
+ private Logger log = LoggerFactory.getLogger(ErrorLoggerTest.class);\r
+\r
+ @Test\r
+ public void testOverloads() throws Exception {\r
+ ErrorLogger e = new ErrorLogger();\r
+ Exception exc = new Exception();\r
+ e.logError("failure", 200);\r
+ e.logError("failure", 200, exc);\r
+ e.logError("failure", 200, "Timeout during HTTP operation");\r
+ e.logError("failure", 200, "Timeout during HTTP operation", exc);\r
+ }\r
+\r
+ @Test\r
+ public void testInvalidErrorCode() throws Exception {\r
+ ErrorLogger e = new ErrorLogger();\r
+ e.logError("failure", 0);\r
+ }\r
+\r
+ @Test\r
+ public void testDescriptionMapping() throws Exception {\r
+ ErrorLogger e = new ErrorLogger();\r
+ e.logError("failure", 100);\r
+ e.logError("failure", 200);\r
+ e.logError("failure", 300);\r
+ e.logError("failure", 400);\r
+ e.logError("failure", 500);\r
+ e.logError("failure", 900);\r
+ }\r
+\r
+ @Test\r
+ public void testIsValidCode() throws Exception {\r
+ ErrorLogger e = new ErrorLogger(log);\r
+ assertTrue(e.isValidCode(ErrorLogger.ERROR_CODE_100));\r
+ assertTrue(e.isValidCode(ErrorLogger.ERROR_CODE_200));\r
+ assertTrue(e.isValidCode(ErrorLogger.ERROR_CODE_300));\r
+ assertTrue(e.isValidCode(ErrorLogger.ERROR_CODE_400));\r
+ assertTrue(e.isValidCode(ErrorLogger.ERROR_CODE_500));\r
+ assertTrue(e.isValidCode(ErrorLogger.ERROR_CODE_900));\r
+\r
+ assertFalse(e.isValidCode(0));\r
+ assertFalse(e.isValidCode(204));\r
+ assertFalse(e.isValidCode(404));\r
+ assertFalse(e.isValidCode(501));\r
+ }\r
+\r
+}\r
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>org.onap.ccsdk.sli.core</groupId>
- <artifactId>sli-recording</artifactId>
- <version>${project.version}</version>
- </dependency>
</dependencies>
import java.util.TimeZone;
import org.onap.ccsdk.sli.core.sli.ConfigurationException;
+import org.onap.ccsdk.sli.core.sli.ErrorLogger;
import org.onap.ccsdk.sli.core.sli.SvcLogicException;
import org.onap.ccsdk.sli.core.sli.SvcLogicRecorder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jRecorder implements SvcLogicRecorder {
-
-
+ protected DateFormat dateFmt;
+ protected static final String messageLogName = "message-log";
+
public enum Level {
ERROR,
WARN,
TRACE
}
+ protected Logger defaultLogger = LoggerFactory.getLogger(Slf4jRecorder.class);
+ protected Logger messageLogger = LoggerFactory.getLogger(messageLogName);
+
+ public Slf4jRecorder() {
+ TimeZone tz = TimeZone.getTimeZone("UTC");
+ dateFmt = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss:SS'+00:00'");
+ dateFmt.setTimeZone(tz);
+ }
+
@Override
public void record(Map<String, String> parmMap) throws SvcLogicException {
- String loggerName = parmMap.get("logger");
- if (loggerName == null) {
- loggerName = "Log4jRecorder";
- }
-
String lvl = parmMap.get("level");
if (lvl == null) {
lvl = "INFO";
throw new ConfigurationException("No record/fields passed in record node");
}
- Logger logger = LoggerFactory.getLogger(loggerName);
+ String loggerName = parmMap.get("logger");
+ Logger logger = null;
+ if (loggerName == null) {
+ logger = defaultLogger;
+ }else {
+ if(loggerName.equals(messageLogName)){
+ logger = messageLogger;
+ }else {
+ logger = LoggerFactory.getLogger(loggerName);
+ }
+ }
Date now = new Date();
- TimeZone tz = TimeZone.getTimeZone("UTC");
- DateFormat dateFmt = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss:SS'+00:00'");
- dateFmt.setTimeZone(tz);
+
if (record.indexOf("__TIMESTAMP__") != -1)
{
record = record.replaceFirst("__TIMESTAMP__", dateFmt.format(now));
switch (level) {
case ERROR:
- logger.error(record);
+ String errorCode = parmMap.get("errorCode");
+ String errorDescription = parmMap.get("errorDescription");
+
+ if ((errorCode != null && !errorCode.isEmpty())
+ || (errorDescription != null && !errorDescription.isEmpty())) {
+ ErrorLogger e = new ErrorLogger(logger);
+
+ Integer integerCode = 0;
+ try {
+ integerCode = Integer.valueOf(errorCode);
+ } catch (NumberFormatException nfe) {
+ // do nothing
+ }
+ e.createLogEntry(record, integerCode, errorDescription, null);
+ } else {
+ logger.error(record);
+ }
break;
case WARN:
logger.warn(record);