minor logging updates
authorSmokowski, Kevin (ks6305) <kevin.smokowski@att.com>
Mon, 24 Feb 2020 18:33:27 +0000 (18:33 +0000)
committerSmokowski, Kevin (ks6305) <kevin.smokowski@att.com>
Mon, 24 Feb 2020 18:33:27 +0000 (18:33 +0000)
create error logger, integrate with record node and improve slf4jrecorder

Issue-ID: CCSDK-2115
Signed-off-by: Smokowski, Kevin (ks6305) <kevin.smokowski@att.com>
Change-Id: I857ce0fac070278a195204195eaae0c53d2d0d52

artifacts/pom.xml
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ErrorLogger.java [new file with mode: 0644]
sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/ErrorLoggerTest.java [new file with mode: 0644]
sli/installer/pom.xml
sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/recording/Slf4jRecorder.java

index f6c883c..a5ed379 100755 (executable)
                                <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>
 
diff --git a/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ErrorLogger.java b/sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/ErrorLogger.java
new file mode 100644 (file)
index 0000000..47f6526
--- /dev/null
@@ -0,0 +1,100 @@
+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
diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/ErrorLoggerTest.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/ErrorLoggerTest.java
new file mode 100644 (file)
index 0000000..d95ff30
--- /dev/null
@@ -0,0 +1,56 @@
+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
index 38905ca..dcbe6b8 100755 (executable)
                        <version>${project.version}</version>
                </dependency>
 
-               <dependency>
-                       <groupId>org.onap.ccsdk.sli.core</groupId>
-                       <artifactId>sli-recording</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
 
        </dependencies>
 
index e3f4f1b..4f67c5d 100644 (file)
@@ -28,14 +28,16 @@ import java.util.Map;
 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,
@@ -44,13 +46,17 @@ public class Slf4jRecorder implements SvcLogicRecorder {
                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";
@@ -98,12 +104,20 @@ public class Slf4jRecorder implements SvcLogicRecorder {
                        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));
@@ -111,7 +125,23 @@ public class Slf4jRecorder implements SvcLogicRecorder {
                
                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);