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

weichiu 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 7062685609 HDDS-12805. Use slf4j for HTTP request log (#8255)
7062685609 is described below

commit 70626856099498442cf571791c591f4d9189dc50
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Fri Apr 11 00:20:16 2025 +0200

    HDDS-12805. Use slf4j for HTTP request log (#8255)
---
 .../hadoop/hdds/server/http/HttpRequestLog.java    | 106 ---------------------
 .../hdds/server/http/HttpRequestLogAppender.java   |  62 ------------
 .../hadoop/hdds/server/http/HttpServer2.java       |  22 +++--
 .../hdds/server/http/TestHttpRequestLog.java       |  51 ----------
 .../server/http/TestHttpRequestLogAppender.java    |  40 --------
 hadoop-ozone/dist/src/shell/conf/log4j.properties  |  19 ++++
 6 files changed, 34 insertions(+), 266 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpRequestLog.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpRequestLog.java
deleted file mode 100644
index e06653ed4b..0000000000
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpRequestLog.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.hadoop.hdds.server.http;
-
-import java.util.HashMap;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogConfigurationException;
-import org.apache.commons.logging.LogFactory;
-import org.apache.commons.logging.impl.Log4JLogger;
-import org.apache.log4j.Appender;
-import org.eclipse.jetty.server.AsyncRequestLogWriter;
-import org.eclipse.jetty.server.CustomRequestLog;
-import org.eclipse.jetty.server.RequestLog;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * RequestLog object for use with Http.
- */
-public final class HttpRequestLog {
-
-  private static final Logger LOG =
-      LoggerFactory.getLogger(HttpRequestLog.class);
-  private static final HashMap<String, String> SERVER_TO_COMPONENT;
-
-  private HttpRequestLog() {
-  }
-
-  static {
-    SERVER_TO_COMPONENT = new HashMap<String, String>();
-    SERVER_TO_COMPONENT.put("cluster", "resourcemanager");
-    SERVER_TO_COMPONENT.put("hdfs", "namenode");
-    SERVER_TO_COMPONENT.put("node", "nodemanager");
-  }
-
-  public static RequestLog getRequestLog(String name) {
-
-    String lookup = SERVER_TO_COMPONENT.get(name);
-    if (lookup != null) {
-      name = lookup;
-    }
-    String loggerName = "http.requests." + name;
-    String appenderName = name + "requestlog";
-    Log logger = LogFactory.getLog(loggerName);
-
-    boolean isLog4JLogger;
-
-    try {
-      isLog4JLogger = logger instanceof Log4JLogger;
-    } catch (NoClassDefFoundError err) {
-      // In some dependent projects, log4j may not even be on the classpath at
-      // runtime, in which case the above instanceof check will throw
-      // NoClassDefFoundError.
-      LOG.debug("Could not load Log4JLogger class", err);
-      isLog4JLogger = false;
-    }
-    if (isLog4JLogger) {
-      Log4JLogger httpLog4JLog = (Log4JLogger) logger;
-      org.apache.log4j.Logger httpLogger = httpLog4JLog.getLogger();
-      Appender appender = null;
-
-      try {
-        appender = httpLogger.getAppender(appenderName);
-      } catch (LogConfigurationException e) {
-        LOG.warn("Http request log for {} could not be created", loggerName);
-        throw e;
-      }
-
-      if (appender == null) {
-        LOG.info("Http request log for {} is not defined", loggerName);
-        return null;
-      }
-
-      if (appender instanceof HttpRequestLogAppender) {
-        HttpRequestLogAppender requestLogAppender
-            = (HttpRequestLogAppender) appender;
-        AsyncRequestLogWriter logWriter = new AsyncRequestLogWriter();
-        logWriter.setFilename(requestLogAppender.getFilename());
-        logWriter.setRetainDays(requestLogAppender.getRetainDays());
-        return new CustomRequestLog(logWriter,
-            CustomRequestLog.EXTENDED_NCSA_FORMAT);
-      } else {
-        LOG.warn("Jetty request log for {} was of the wrong class", 
loggerName);
-        return null;
-      }
-    } else {
-      LOG.warn("Jetty request log can only be enabled using Log4j");
-      return null;
-    }
-  }
-}
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpRequestLogAppender.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpRequestLogAppender.java
deleted file mode 100644
index 9777e2d9b5..0000000000
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpRequestLogAppender.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.hadoop.hdds.server.http;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * Log4j Appender adapter for HttpRequestLog.
- */
-public class HttpRequestLogAppender extends AppenderSkeleton {
-
-  private String filename;
-  private int retainDays;
-
-  public HttpRequestLogAppender() {
-  }
-
-  public void setRetainDays(int retainDays) {
-    this.retainDays = retainDays;
-  }
-
-  public int getRetainDays() {
-    return retainDays;
-  }
-
-  public void setFilename(String filename) {
-    this.filename = filename;
-  }
-
-  public String getFilename() {
-    return filename;
-  }
-
-  @Override
-  public void append(LoggingEvent event) {
-  }
-
-  @Override
-  public void close() {
-  }
-
-  @Override
-  public boolean requiresLayout() {
-    return false;
-  }
-}
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java
index 241fb5ab81..3b76325226 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java
@@ -89,6 +89,7 @@
 import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.server.ConnectionFactory;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.CustomRequestLog;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -96,6 +97,7 @@
 import org.eclipse.jetty.server.SecureRequestCustomizer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.Slf4jRequestLogWriter;
 import org.eclipse.jetty.server.SslConnectionFactory;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.HandlerCollection;
@@ -618,14 +620,13 @@ private void initializeWebServer(Builder builder) throws 
IOException {
     handler.getSessionCookieConfig().setSecure(true);
 
     ContextHandlerCollection contexts = new ContextHandlerCollection();
-    RequestLog requestLog = HttpRequestLog.getRequestLog(builder.name);
-
     handlers.addHandler(contexts);
-    if (requestLog != null) {
-      RequestLogHandler requestLogHandler = new RequestLogHandler();
-      requestLogHandler.setRequestLog(requestLog);
-      handlers.addHandler(requestLogHandler);
-    }
+
+    RequestLog requestLog = getRequestLog(builder.name);
+    RequestLogHandler requestLogHandler = new RequestLogHandler();
+    requestLogHandler.setRequestLog(requestLog);
+    handlers.addHandler(requestLogHandler);
+
     handlers.addHandler(webAppContext);
     final String appDir = getWebAppsPath(builder.name);
     if (!builder.skipDefaultApps) {
@@ -1794,4 +1795,11 @@ public static void setHttpBaseDir(OzoneConfiguration 
ozoneConfiguration)
               tmpMetaDir.getAbsolutePath());
     }
   }
+
+  private static RequestLog getRequestLog(String name) {
+    String loggerName = "http.requests." + name;
+    Slf4jRequestLogWriter writer = new Slf4jRequestLogWriter();
+    writer.setLoggerName(loggerName);
+    return new CustomRequestLog(writer, CustomRequestLog.EXTENDED_NCSA_FORMAT);
+  }
 }
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestHttpRequestLog.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestHttpRequestLog.java
deleted file mode 100644
index eb596acc7a..0000000000
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestHttpRequestLog.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.hadoop.hdds.server.http;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-import org.apache.log4j.Logger;
-import org.eclipse.jetty.server.CustomRequestLog;
-import org.eclipse.jetty.server.RequestLog;
-import org.junit.jupiter.api.Test;
-
-/**
- * Testing HttpRequestLog.
- */
-public class TestHttpRequestLog {
-
-  @Test
-  public void testAppenderUndefined() {
-    RequestLog requestLog = HttpRequestLog.getRequestLog("test");
-    assertNull(requestLog, "RequestLog should be null");
-  }
-
-  @Test
-  public void testAppenderDefined() {
-    HttpRequestLogAppender requestLogAppender = new HttpRequestLogAppender();
-    requestLogAppender.setName("testrequestlog");
-    Logger.getLogger("http.requests.test").addAppender(requestLogAppender);
-    RequestLog requestLog = HttpRequestLog.getRequestLog("test");
-    Logger.getLogger("http.requests.test").removeAppender(requestLogAppender);
-    assertNotNull(requestLog, "RequestLog should not be null");
-    assertEquals(CustomRequestLog.class, requestLog.getClass(),
-        "Class mismatch");
-  }
-}
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestHttpRequestLogAppender.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestHttpRequestLogAppender.java
deleted file mode 100644
index 418f921584..0000000000
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/server/http/TestHttpRequestLogAppender.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.hadoop.hdds.server.http;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Test Http request log appender.
- */
-public class TestHttpRequestLogAppender {
-
-  @Test
-  public void testParameterPropagation() {
-
-    HttpRequestLogAppender requestLogAppender = new HttpRequestLogAppender();
-    requestLogAppender.setFilename("jetty-namenode-yyyy_mm_dd.log");
-    requestLogAppender.setRetainDays(17);
-    assertEquals("jetty-namenode-yyyy_mm_dd.log",
-        requestLogAppender.getFilename(), "Filename mismatch");
-    assertEquals(17, requestLogAppender.getRetainDays(),
-        "Retain days mismatch");
-  }
-}
diff --git a/hadoop-ozone/dist/src/shell/conf/log4j.properties 
b/hadoop-ozone/dist/src/shell/conf/log4j.properties
index aa3d0b4bf4..ae3c6f51cf 100644
--- a/hadoop-ozone/dist/src/shell/conf/log4j.properties
+++ b/hadoop-ozone/dist/src/shell/conf/log4j.properties
@@ -122,6 +122,25 @@ log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout
 log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
 log4j.appender.DRFAS.DatePattern=.yyyy-MM-dd
 
+#
+# HTTP request logs
+#
+log4j.appender.HttpAccess=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.HttpAccess.File=${hadoop.log.dir}/access.log
+log4j.appender.HttpAccess.DatePattern=.yyyy-MM-dd
+log4j.appender.HttpAccess.layout=org.apache.log4j.PatternLayout
+log4j.appender.HttpAccess.layout.ConversionPattern=%m%n
+
+log4j.additivity.http.requests=false
+log4j.logger.http.requests=INFO,HttpAccess
+# Create separate appender for each co-hosted component if needed, then enable 
distinct logger configs:
+#log4j.logger.http.requests.hddsDatanode=INFO,HttpAccess
+#log4j.logger.http.requests.ozoneManager=INFO,HttpAccess
+#log4j.logger.http.requests.recon=INFO,HttpAccess
+#log4j.logger.http.requests.s3gateway=INFO,HttpAccess
+#log4j.logger.http.requests.s3g-web=INFO,HttpAccess
+#log4j.logger.http.requests.scm=INFO,HttpAccess
+#log4j.logger.http.requests.webhdfs=INFO,HttpAccess
 
 # Custom Logging levels
 # AWS SDK & S3A FileSystem


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

Reply via email to