This is an automated email from the ASF dual-hosted git repository.

erose pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 24413d9f8a HDDS-9002. Container log should write to separate file 
(#5053)
24413d9f8a is described below

commit 24413d9f8ae93785d83860a7c25bd8b328162203
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Thu Jul 13 05:31:03 2023 +0200

    HDDS-9002. Container log should write to separate file (#5053)
---
 .../container/common/utils/ContainerLogger.java    |  6 +-
 .../TestKeyValueContainerMetadataInspector.java    |  5 +-
 hadoop-hdds/test-utils/pom.xml                     |  9 +++
 .../org/apache/ozone/test/GenericTestUtils.java    | 45 +++++--------
 .../java/org/apache/ozone/test/Log4j1Capturer.java | 59 +++++++++++++++++
 .../java/org/apache/ozone/test/Log4j2Capturer.java | 75 ++++++++++++++++++++++
 ...tBackgroundContainerDataScannerIntegration.java |  4 +-
 ...kgroundContainerMetadataScannerIntegration.java |  4 +-
 ...estOnDemandContainerDataScannerIntegration.java |  4 +-
 9 files changed, 170 insertions(+), 41 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerLogger.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerLogger.java
index 46f8c151e3..6a5c5c1175 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerLogger.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerLogger.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.ozone.container.common.utils;
 
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.hadoop.ozone.container.common.impl.ContainerData;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import static 
org.apache.hadoop.ozone.container.common.interfaces.Container.ScanResult;
 
@@ -40,7 +40,7 @@ public final class ContainerLogger {
 
   @VisibleForTesting
   public static final String LOG_NAME = "ContainerLog";
-  private static final Logger LOG = LoggerFactory.getLogger(LOG_NAME);
+  private static final Logger LOG = LogManager.getLogger(LOG_NAME);
   private static final String FIELD_SEPARATOR = " | ";
 
   private ContainerLogger() { }
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMetadataInspector.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMetadataInspector.java
index f201bf5b48..eaf8939a91 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMetadataInspector.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/TestKeyValueContainerMetadataInspector.java
@@ -46,6 +46,8 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import static org.apache.ozone.test.GenericTestUtils.toLog4j;
+
 /**
  * Tests for {@link KeyValueContainerMetadataInspector}.
  */
@@ -499,7 +501,8 @@ public class TestKeyValueContainerMetadataInspector
     // parsed as json.
     GenericTestUtils.LogCapturer capturer =
         GenericTestUtils.LogCapturer.captureLogs(
-            KeyValueContainerMetadataInspector.REPORT_LOG, new 
PatternLayout());
+            toLog4j(KeyValueContainerMetadataInspector.REPORT_LOG),
+            new PatternLayout());
     KeyValueContainerUtil.parseKVContainerData(containerData, getConf());
     capturer.stopCapturing();
     String output = capturer.getOutput();
diff --git a/hadoop-hdds/test-utils/pom.xml b/hadoop-hdds/test-utils/pom.xml
index 5c5fc0bdbd..e9c8f2b454 100644
--- a/hadoop-hdds/test-utils/pom.xml
+++ b/hadoop-hdds/test-utils/pom.xml
@@ -71,6 +71,15 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd";>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>org.jacoco</groupId>
       <artifactId>org.jacoco.core</artifactId>
diff --git 
a/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
index b2215f46ed..9cd97eaabb 100644
--- 
a/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
+++ 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
@@ -34,13 +34,10 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.WriterAppender;
 import org.junit.Assert;
 import org.mockito.Mockito;
 import java.lang.reflect.Field;
@@ -312,48 +309,40 @@ public abstract class GenericTestUtils {
   /**
    * Class to capture logs for doing assertions.
    */
-  public static final class LogCapturer {
-    private StringWriter sw = new StringWriter();
-    private WriterAppender appender;
-    private Logger logger;
+  public abstract static class LogCapturer {
+    private final StringWriter sw = new StringWriter();
 
-    public static LogCapturer captureLogs(org.slf4j.Logger logger) {
-      return new LogCapturer(toLog4j(logger), getDefaultLayout());
+    public static LogCapturer captureLogs(Logger logger) {
+      return new Log4j1Capturer(logger);
     }
 
-    public static LogCapturer captureLogs(org.slf4j.Logger logger,
-        Layout layout) {
-      return new LogCapturer(toLog4j(logger), layout);
+    public static LogCapturer captureLogs(Logger logger, Layout layout) {
+      return new Log4j1Capturer(logger, layout);
     }
 
-    private static Layout getDefaultLayout() {
-      Appender defaultAppender = Logger.getRootLogger().getAppender("stdout");
-      if (defaultAppender == null) {
-        defaultAppender = Logger.getRootLogger().getAppender("console");
-      }
-      return (defaultAppender == null) ? new PatternLayout() :
-          defaultAppender.getLayout();
+    public static LogCapturer captureLogs(org.slf4j.Logger logger) {
+      return new Log4j1Capturer(toLog4j(logger));
     }
 
-    private LogCapturer(Logger logger, Layout layout) {
-      this.logger = logger;
-      this.appender = new WriterAppender(layout, sw);
-      logger.addAppender(this.appender);
+    // TODO: let Log4j2Capturer capture only specific logger's logs
+    public static LogCapturer log4j2(String ignoredLoggerName) {
+      return Log4j2Capturer.getInstance();
     }
 
     public String getOutput() {
-      return sw.toString();
+      return writer().toString();
     }
 
-    public void stopCapturing() {
-      logger.removeAppender(appender);
+    public abstract void stopCapturing();
+
+    protected StringWriter writer() {
+      return sw;
     }
 
     public void clearOutput() {
-      sw.getBuffer().setLength(0);
+      writer().getBuffer().setLength(0);
     }
   }
-
   @Deprecated
   public static Logger toLog4j(org.slf4j.Logger logger) {
     return LogManager.getLogger(logger.getName());
diff --git 
a/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/Log4j1Capturer.java
 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/Log4j1Capturer.java
new file mode 100644
index 0000000000..58f7088a53
--- /dev/null
+++ 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/Log4j1Capturer.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.ozone.test;
+
+import org.apache.log4j.Appender;
+import org.apache.log4j.Layout;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.WriterAppender;
+
+/**
+ * Capture Log4j1 logs.
+ */
+class Log4j1Capturer extends GenericTestUtils.LogCapturer {
+  private final Appender appender;
+  private final Logger logger;
+
+  private static Layout getDefaultLayout() {
+    Logger rootLogger = Logger.getRootLogger();
+
+    Appender defaultAppender = rootLogger.getAppender("stdout");
+    if (defaultAppender == null) {
+      defaultAppender = rootLogger.getAppender("console");
+    }
+
+    return defaultAppender == null
+        ? new PatternLayout()
+        : defaultAppender.getLayout();
+  }
+
+  Log4j1Capturer(Logger logger) {
+    this(logger, getDefaultLayout());
+  }
+
+  Log4j1Capturer(Logger logger, Layout layout) {
+    this.logger = logger;
+    this.appender = new WriterAppender(layout, writer());
+    logger.addAppender(appender);
+  }
+
+  public void stopCapturing() {
+    logger.removeAppender(appender);
+  }
+}
diff --git 
a/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/Log4j2Capturer.java
 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/Log4j2Capturer.java
new file mode 100644
index 0000000000..f00b3291bf
--- /dev/null
+++ 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/Log4j2Capturer.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.ozone.test;
+
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.WriterAppender;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+
+import java.io.Writer;
+
+/**
+ * Capture Log4j2 logs.
+ */
+final class Log4j2Capturer extends GenericTestUtils.LogCapturer {
+  private static final String APPENDER_NAME = "capture";
+
+  private static final Log4j2Capturer INSTANCE = new Log4j2Capturer();
+
+  public static Log4j2Capturer getInstance() {
+    return INSTANCE;
+  }
+
+  private Log4j2Capturer() {
+    addAppender(writer());
+  }
+
+  public void stopCapturing() {
+    final LoggerContext context = LoggerContext.getContext(false);
+    final Configuration config = context.getConfiguration();
+    removeAppender(config);
+  }
+
+  private void addAppender(final Writer writer) {
+    final LoggerContext context = LoggerContext.getContext(false);
+    final Configuration config = context.getConfiguration();
+    final PatternLayout layout = PatternLayout.createDefaultLayout(config);
+    final Appender appender = WriterAppender.createAppender(layout, null,
+        writer, APPENDER_NAME, false, true);
+    appender.start();
+    config.addAppender(appender);
+    addAppender(appender, config);
+  }
+
+  private void addAppender(Appender appender, Configuration config) {
+    for (final LoggerConfig loggerConfig : config.getLoggers().values()) {
+      loggerConfig.addAppender(appender, null, null);
+    }
+    config.getRootLogger().addAppender(appender, null, null);
+  }
+
+  private void removeAppender(final Configuration config) {
+    for (final LoggerConfig loggerConfig : config.getLoggers().values()) {
+      loggerConfig.removeAppender(APPENDER_NAME);
+    }
+    config.getRootLogger().removeAppender(APPENDER_NAME);
+  }
+}
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerDataScannerIntegration.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerDataScannerIntegration.java
index d8eb73fb0d..79a60d7968 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerDataScannerIntegration.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerDataScannerIntegration.java
@@ -31,7 +31,6 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.slf4j.LoggerFactory;
 
 import java.util.Collection;
 import java.util.concurrent.TimeUnit;
@@ -73,8 +72,7 @@ public class TestBackgroundContainerDataScannerIntegration
   public TestBackgroundContainerDataScannerIntegration(
       ContainerCorruptions corruption) {
     this.corruption = corruption;
-    logCapturer = LogCapturer.captureLogs(
-            LoggerFactory.getLogger(ContainerLogger.LOG_NAME));
+    logCapturer = 
GenericTestUtils.LogCapturer.log4j2(ContainerLogger.LOG_NAME);
   }
 
   /**
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerMetadataScannerIntegration.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerMetadataScannerIntegration.java
index 0713aeacf1..ee0e852f2d 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerMetadataScannerIntegration.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestBackgroundContainerMetadataScannerIntegration.java
@@ -31,7 +31,6 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.slf4j.LoggerFactory;
 
 import java.time.Duration;
 import java.util.Collection;
@@ -84,8 +83,7 @@ public class TestBackgroundContainerMetadataScannerIntegration
   public TestBackgroundContainerMetadataScannerIntegration(
       ContainerCorruptions corruption) {
     this.corruption = corruption;
-    logCapturer = GenericTestUtils.LogCapturer.captureLogs(
-        LoggerFactory.getLogger(ContainerLogger.LOG_NAME));
+    logCapturer = 
GenericTestUtils.LogCapturer.log4j2(ContainerLogger.LOG_NAME);
   }
 
   /**
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestOnDemandContainerDataScannerIntegration.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestOnDemandContainerDataScannerIntegration.java
index 2c60c577f0..1430e4f965 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestOnDemandContainerDataScannerIntegration.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/scanner/TestOnDemandContainerDataScannerIntegration.java
@@ -30,7 +30,6 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.slf4j.LoggerFactory;
 
 import java.util.Collection;
 
@@ -89,8 +88,7 @@ public class TestOnDemandContainerDataScannerIntegration
   public TestOnDemandContainerDataScannerIntegration(
       ContainerCorruptions corruption) {
     this.corruption = corruption;
-    logCapturer = GenericTestUtils.LogCapturer.captureLogs(
-        LoggerFactory.getLogger(ContainerLogger.LOG_NAME));
+    logCapturer = 
GenericTestUtils.LogCapturer.log4j2(ContainerLogger.LOG_NAME);
   }
 
   /**


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to