refactor slf4j Marker to common repo 37/123037/3
authorTaka Cho <takamune.cho@att.com>
Mon, 2 Aug 2021 16:06:08 +0000 (12:06 -0400)
committerTaka Cho <takamune.cho@att.com>
Mon, 2 Aug 2021 20:38:06 +0000 (16:38 -0400)
slf4j Marker logger is using in drools-pdp
and clamp. was suggested to move to common repo
to reduce duplicated codes. And possibly other
repo would be used also.

Issue-ID: POLICY-3087
Change-Id: If14b89c18e28f517f83a2b9a8dcce201333a919e
Signed-off-by: Taka Cho <takamune.cho@att.com>
common-logging/src/main/java/org/onap/policy/common/logging/LoggerMarkerFilter.java [new file with mode: 0644]
common-logging/src/main/java/org/onap/policy/common/logging/LoggerUtils.java [new file with mode: 0644]
common-logging/src/test/java/org/onap/policy/common/logging/LoggerUtilsTest.java [new file with mode: 0644]

diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/LoggerMarkerFilter.java b/common-logging/src/main/java/org/onap/policy/common/logging/LoggerMarkerFilter.java
new file mode 100644 (file)
index 0000000..7fc4ddc
--- /dev/null
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP POLICY
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All right reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.policy.common.logging;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.AbstractMatcherFilter;
+import ch.qos.logback.core.spi.FilterReply;
+import org.slf4j.Marker;
+
+public abstract class LoggerMarkerFilter extends AbstractMatcherFilter<ILoggingEvent> {
+
+    protected final Marker marker;
+
+    protected LoggerMarkerFilter(Marker marker) {
+        this.marker = marker;
+    }
+
+    @Override
+    public FilterReply decide(ILoggingEvent event) {
+
+        if (this.marker == null || !isStarted()) {
+            return FilterReply.DENY;
+        }
+
+        if (event == null || event.getMarker() == null) {
+            return FilterReply.DENY;
+        }
+
+        if (event.getMarker().equals(marker)) {
+            return FilterReply.ACCEPT;
+        } else {
+            return FilterReply.DENY;
+        }
+    }
+
+    /**
+     * Metric Logger Marker Filter.
+     */
+    public static class MetricLoggerMarkerFilter extends LoggerMarkerFilter {
+
+        public MetricLoggerMarkerFilter() {
+            super(LoggerUtils.METRIC_LOG_MARKER);
+        }
+
+    }
+
+    /**
+     * Security Logger Marker Filter.
+     */
+    public static class SecurityLoggerMarkerFilter extends LoggerMarkerFilter {
+
+        public SecurityLoggerMarkerFilter() {
+            super(LoggerUtils.SECURITY_LOG_MARKER);
+        }
+    }
+
+    /**
+     * Audit Logger Marker Filter.
+     */
+    public static class AuditLoggerMarkerFilter extends LoggerMarkerFilter {
+
+        public AuditLoggerMarkerFilter() {
+            super(LoggerUtils.AUDIT_LOG_MARKER);
+        }
+    }
+
+    /**
+     * Transaction Logger Marker Filter.
+     */
+    public static class TransactionLoggerMarkerFilter extends LoggerMarkerFilter {
+
+        public TransactionLoggerMarkerFilter() {
+            super(LoggerUtils.TRANSACTION_LOG_MARKER);
+        }
+    }
+
+}
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/LoggerUtils.java b/common-logging/src/main/java/org/onap/policy/common/logging/LoggerUtils.java
new file mode 100644 (file)
index 0000000..298bd53
--- /dev/null
@@ -0,0 +1,128 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP POLICY
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.policy.common.logging;
+
+import ch.qos.logback.classic.LoggerContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+
+public class LoggerUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerUtils.class);
+
+    /**
+     * ROOT logger.
+     */
+    public static final String ROOT_LOGGER = "ROOT";
+    /**
+     * Metric logger.
+     */
+    public static final String METRIC_LOG_MARKER_NAME = "metric";
+    /**
+     * Audit Log Marker Name.
+     */
+    public static final String AUDIT_LOG_MARKER_NAME = "audit";
+    /**
+     * Security Log Marker Name.
+     */
+    public static final String SECURITY_LOG_MARKER_NAME = "security";
+    /**
+     * Transaction Log Marker Name.
+     */
+    public static final String TRANSACTION_LOG_MARKER_NAME = "transaction";
+    /**
+     * Marks a logging record for metric.
+     */
+    public static final Marker METRIC_LOG_MARKER = MarkerFactory.getMarker(METRIC_LOG_MARKER_NAME);
+    /**
+     * Marks a logging record for security.
+     */
+    public static final Marker SECURITY_LOG_MARKER = MarkerFactory.getMarker(SECURITY_LOG_MARKER_NAME);
+    /**
+     * Marks a logging record for audit.
+     */
+    public static final Marker AUDIT_LOG_MARKER = MarkerFactory.getMarker(AUDIT_LOG_MARKER_NAME);
+    /**
+     * Marks a logging record as an end-to-end transaction.
+     */
+    public static final Marker TRANSACTION_LOG_MARKER = MarkerFactory.getMarker(TRANSACTION_LOG_MARKER_NAME);
+
+    /**
+     * Logger delegate.
+     */
+    private final Logger mlogger;
+
+    /**
+     * Constructor.
+     */
+    public LoggerUtils(final Logger loggerP) {
+        this.mlogger = checkNotNull(loggerP);
+    }
+
+    /**
+     * Set the log level of a logger.
+     *
+     * @param loggerName logger name
+     * @param loggerLevel logger level
+     */
+    public static String setLevel(String loggerName, String loggerLevel) {
+        if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
+            throw new IllegalStateException("The SLF4J logger factory is not configured for logback");
+        }
+
+        final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+        final var logger = context.getLogger(loggerName);
+        if (logger == null) {
+            throw new IllegalArgumentException("no logger " + loggerName);
+        }
+
+        LOGGER.warn("setting {} logger to level {}", loggerName, loggerLevel);
+
+        // use the current log level if the string provided cannot be converted to a valid Level.
+
+        // NOSONAR: this method is currently used by the telemetry api (which should be authenticated).
+        // It is no more or no less dangerous than an admin changing the logback level on the fly.
+        // This is a controlled admin function that should not cause any risks when the system
+        // is configured properly.
+        logger.setLevel(ch.qos.logback.classic.Level.toLevel(loggerLevel, logger.getLevel()));  // NOSONAR
+
+        return logger.getLevel().toString();
+    }
+
+    /**
+     * Dependency-free nullcheck.
+     *
+     * @param in  to be checked
+     * @param <T> argument (and return) type
+     * @return input arg
+     */
+    private static <T> T checkNotNull(final T in) {
+        if (in == null) {
+            throw new NullPointerException();
+        }
+        return in;
+    }
+}
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/LoggerUtilsTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/LoggerUtilsTest.java
new file mode 100644 (file)
index 0000000..84e63b6
--- /dev/null
@@ -0,0 +1,61 @@
+/*-
+* ============LICENSE_START=======================================================
+* ONAP Policy
+* ================================================================================
+* Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+* ================================================================================
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+* ============LICENSE_END============================================
+* ===================================================================
+*
+*/
+
+package org.onap.policy.common.logging;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LoggerUtilsTest {
+    protected static final Logger logger = LoggerFactory.getLogger(LoggerUtilsTest.class);
+
+    private LoggerUtils util;
+
+    @Before
+    public void setup() {
+        this.util = new LoggerUtils(logger);
+    }
+
+    @Test
+    public void testMarker() {
+        assertTrue(logger.isInfoEnabled());
+        logger.info("line 1");
+        logger.info(LoggerUtils.METRIC_LOG_MARKER, "line 1 Metric");
+        logger.info(LoggerUtils.AUDIT_LOG_MARKER, "line 1 Audit");
+        logger.info(LoggerUtils.SECURITY_LOG_MARKER, "line 1 Security");
+        logger.info(LoggerUtils.TRANSACTION_LOG_MARKER, "line 1 Transaction");
+        LoggerUtils.setLevel(LoggerUtils.ROOT_LOGGER, "debug");
+        logger.debug("line 2");
+        logger.debug(LoggerUtils.METRIC_LOG_MARKER, "line 2 Metric");
+        logger.debug(LoggerUtils.AUDIT_LOG_MARKER, "line 2 Audit");
+        logger.debug(LoggerUtils.SECURITY_LOG_MARKER, "line 2 Security");
+        logger.info(LoggerUtils.TRANSACTION_LOG_MARKER, "line 2 Transaction");
+        assertTrue(logger.isDebugEnabled());
+    }
+}