Add InvocationID to p_mdc field in audit logs
[sdc.git] / openecomp-be / lib / openecomp-sdc-logging-lib / openecomp-sdc-logging-core / src / main / java / org / openecomp / sdc / logging / slf4j / SLF4JLoggerWrapper.java
index 5d22345..5402609 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 European Support Limited
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.openecomp.sdc.logging.slf4j;
 
+import java.text.SimpleDateFormat;
+import java.util.UUID;
+import org.openecomp.sdc.logging.api.AuditData;
 import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.MetricsData;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 /**
- * @author EVITALIY
+ * Delegates log calls to SLF4J API and MDC.
+ *
+ * @author evitaliy
  * @since 08 Jan 18
  */
 class SLF4JLoggerWrapper implements Logger {
 
+    //The specified format presents time in UTC formatted per ISO 8601, as required by ONAP logging guidelines
+    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
+
     private final org.slf4j.Logger logger;
 
+    // May cause http://www.slf4j.org/codes.html#loggerNameMismatch
     SLF4JLoggerWrapper(Class<?> clazz) {
-        logger = LoggerFactory.getLogger(clazz);
+        this(LoggerFactory.getLogger(clazz));
+    }
+
+    SLF4JLoggerWrapper(org.slf4j.Logger delegate) {
+        this.logger = delegate;
     }
 
     SLF4JLoggerWrapper(String className) {
-        logger = LoggerFactory.getLogger(className);
+        this(LoggerFactory.getLogger(className));
     }
 
     @Override
@@ -47,57 +62,113 @@ class SLF4JLoggerWrapper implements Logger {
 
     @Override
     public void metrics(String msg) {
-        logger.info(Markers.METRICS, msg);
+        // do nothing, left for backward compatibility
     }
 
     @Override
-    public void metrics(String msg, Object arg) {
-        logger.info(Markers.METRICS, msg, arg);
+    public void metrics(MetricsData data) {
+
+        if (data == null) {
+            return; // not going to fail because of null
+        }
+
+        try {
+            putMetricsOnMdc(data);
+            logger.info(Markers.METRICS, "");
+        } finally {
+            clearMetricsFromMdc();
+        }
     }
 
-    @Override
-    public void metrics(String msg, Object arg1, Object arg2) {
-        logger.info(Markers.METRICS, msg, arg1, arg2);
+    private void putMetricsOnMdc(MetricsData metrics) {
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_PATTERN);
+        unsafePutOnMdc(MetricsField.BEGIN_TIMESTAMP, dateFormat.format(metrics.getStartTime()));
+        unsafePutOnMdc(MetricsField.END_TIMESTAMP, dateFormat.format(metrics.getEndTime()));
+        unsafePutOnMdc(MetricsField.ELAPSED_TIME, String.valueOf(metrics.getEndTime() - metrics.getStartTime()));
+        safePutOnMdc(MetricsField.RESPONSE_CODE, metrics.getResponseCode());
+        safePutOnMdc(MetricsField.RESPONSE_DESCRIPTION, metrics.getResponseDescription());
+        safePutOnMdc(MetricsField.CLIENT_IP_ADDRESS, metrics.getClientIpAddress());
+        safePutOnMdc(MetricsField.TARGET_ENTITY, metrics.getTargetEntity());
+        safePutOnMdc(MetricsField.TARGET_VIRTUAL_ENTITY, metrics.getTargetVirtualEntity());
+
+        if (metrics.getStatusCode() != null) {
+            unsafePutOnMdc(MetricsField.STATUS_CODE, metrics.getStatusCode().name());
+        }
     }
 
-    @Override
-    public void metrics(String msg, Object... arguments) {
-        logger.info(Markers.METRICS, msg, arguments);
+    private void clearMetricsFromMdc() {
+        for (MetricsField f : MetricsField.values()) {
+            MDC.remove(f.asKey());
+        }
     }
 
-    @Override
-    public void metrics(String msg, Throwable t) {
-        logger.info(Markers.METRICS, msg, t);
+    private static void unsafePutOnMdc(MDCField field, String value) {
+        MDC.put(field.asKey(), value);
     }
 
-    @Override
-    public boolean isAuditEnabled() {
-        return logger.isInfoEnabled(Markers.AUDIT);
+    private static void safePutOnMdc(MDCField field, String value) {
+        if (value != null) {
+            unsafePutOnMdc(field, value);
+        }
     }
 
     @Override
-    public void audit(String msg) {
-        logger.info(Markers.AUDIT, msg);
+    public boolean isAuditEnabled() {
+        return logger.isInfoEnabled(Markers.EXIT);
     }
 
     @Override
-    public void audit(String msg, Object arg) {
-        logger.info(Markers.AUDIT, msg, arg);
+    public void auditEntry(AuditData data) {
+
+        if (data == null) {
+            return; // not failing if null
+        }
+
+        try {
+            putAuditOnMdc(data);
+            logger.info(Markers.ENTRY, "");
+        } finally {
+            clearAuditFromMdc();
+        }
     }
 
+
     @Override
-    public void audit(String msg, Object arg1, Object arg2) {
-        logger.info(Markers.AUDIT, msg, arg1, arg2);
+    public void auditExit(AuditData data) {
+
+        if (data == null) {
+            return; // not failing if null
+        }
+
+        try {
+            putAuditOnMdc(data);
+            logger.info(Markers.EXIT, "");
+        } finally {
+            clearAuditFromMdc();
+        }
     }
 
-    @Override
-    public void audit(String msg, Object... arguments) {
-        logger.info(Markers.AUDIT, msg, arguments);
+    private void putAuditOnMdc(AuditData audit) {
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_PATTERN);
+        unsafePutOnMdc(AuditField.BEGIN_TIMESTAMP, dateFormat.format(audit.getStartTime()));
+        unsafePutOnMdc(AuditField.END_TIMESTAMP, dateFormat.format(audit.getEndTime()));
+        unsafePutOnMdc(AuditField.ELAPSED_TIME, String.valueOf(audit.getEndTime() - audit.getStartTime()));
+        safePutOnMdc(AuditField.RESPONSE_CODE, audit.getResponseCode());
+        safePutOnMdc(AuditField.RESPONSE_DESCRIPTION, audit.getResponseDescription());
+        safePutOnMdc(AuditField.CLIENT_IP_ADDRESS, audit.getClientIpAddress());
+        unsafePutOnMdc(AuditField.INVOCATION_ID, UUID.randomUUID().toString());
+
+        if (audit.getStatusCode() != null) {
+            unsafePutOnMdc(AuditField.STATUS_CODE, audit.getStatusCode().name());
+        }
     }
 
-    @Override
-    public void audit(String msg, Throwable t) {
-        logger.info(Markers.AUDIT, msg, t);
+    private void clearAuditFromMdc() {
+        for (AuditField f : AuditField.values()) {
+            MDC.remove(f.asKey());
+        }
     }
 
     @Override