You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2021/01/22 16:37:04 UTC

[cxf] branch 3.4.x-fixes updated: [CXF-8412]introduce EnableRecordRequestStartTime propery so that request process duration time can be logged for http-undertow transport

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

ffang pushed a commit to branch 3.4.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/3.4.x-fixes by this push:
     new 10e1322  [CXF-8412]introduce EnableRecordRequestStartTime propery so that request process duration time can be logged for http-undertow transport
10e1322 is described below

commit 10e1322cfb148d8ebc37b43ef2d3afd74dcdd226
Author: Freeman Fang <fr...@gmail.com>
AuthorDate: Fri Jan 22 11:36:06 2021 -0500

    [CXF-8412]introduce EnableRecordRequestStartTime propery so that request process duration time can be logged for http-undertow transport
    
    (cherry picked from commit 356c0eca80991fa821e95326f6a8578fc018a017)
---
 .../http_undertow/UndertowHTTPServerEngine.java    | 18 +++++
 .../handlers/CxfUndertowLogHandler.java            | 81 ++++++++++++++++++----
 .../http_undertow/undertowBasicAuthServer.xml      | 13 +++-
 3 files changed, 96 insertions(+), 16 deletions(-)

diff --git a/rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngine.java b/rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngine.java
index 76b4f77..3f3b561 100644
--- a/rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngine.java
+++ b/rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngine.java
@@ -69,6 +69,9 @@ public class UndertowHTTPServerEngine implements ServerEngine {
     public static final String DO_NOT_CHECK_URL_PROP = "org.apache.cxf.transports.http_undertow.DontCheckUrl";
     
     public static final String ENABLE_HTTP2_PROP = "org.apache.cxf.transports.http_undertow.EnableHttp2";
+    
+    public static final String ENABLE_RECORD_REQUEST_START_TIME_PROP = 
+        "org.apache.cxf.transports.http_undertow.EnableRecordRequestStartTime";
 
     private static final Logger LOG = LogUtils.getL7dLogger(UndertowHTTPServerEngine.class);
 
@@ -203,6 +206,9 @@ public class UndertowHTTPServerEngine implements ServerEngine {
         if (this.shouldEnableHttp2(undertowHTTPHandler.getBus())) {
             result.setServerOption(UndertowOptions.ENABLE_HTTP2, Boolean.TRUE);
         }
+        if (this.shouldEnableRecordRequestStartTime(undertowHTTPHandler.getBus())) {
+            result.setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, Boolean.TRUE);
+        }
         if (tlsServerParameters != null) {
             if (this.sslContext == null) {
                 this.sslContext = createSSLContext();
@@ -318,6 +324,18 @@ public class UndertowHTTPServerEngine implements ServerEngine {
         }
         return PropertyUtils.isTrue(prop);
     }
+    
+    private boolean shouldEnableRecordRequestStartTime(Bus bus) {
+
+        Object prop = null;
+        if (bus != null) {
+            prop = bus.getProperty(ENABLE_RECORD_REQUEST_START_TIME_PROP);
+        }
+        if (prop == null) {
+            prop = SystemPropertyAction.getPropertyOrNull(ENABLE_RECORD_REQUEST_START_TIME_PROP);
+        }
+        return PropertyUtils.isTrue(prop);
+    }
 
     protected void checkRegistedContext(URL url) {
 
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/LogHandler.java b/rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/handlers/CxfUndertowLogHandler.java
similarity index 59%
rename from systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/LogHandler.java
rename to rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/handlers/CxfUndertowLogHandler.java
index 509c95b..00a2350 100644
--- a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/LogHandler.java
+++ b/rt/transports/http-undertow/src/main/java/org/apache/cxf/transport/http_undertow/handlers/CxfUndertowLogHandler.java
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.cxf.systest.http_undertow;
+package org.apache.cxf.transport.http_undertow.handlers;
 
 import java.io.File;
 import java.io.IOException;
@@ -35,14 +34,20 @@ import io.undertow.server.handlers.accesslog.AccessLogHandler;
 import io.undertow.server.handlers.accesslog.AccessLogReceiver;
 import io.undertow.server.handlers.accesslog.DefaultAccessLogReceiver;
 
-public class LogHandler implements CXFUndertowHttpHandler {
 
+
+
+public class CxfUndertowLogHandler implements CXFUndertowHttpHandler {
+    
     private HttpHandler next;
     private AccessLogHandler accessLogHandler;
-
+    private String pattern;
+    private String outPutDirectory;
+    private String baseName;
+    private String suffix;
+    
     @Override
     public void handleRequest(HttpServerExchange exchange) throws Exception {
-
         if (accessLogHandler == null) {
             buildLogHandler();
         }
@@ -52,20 +57,34 @@ public class LogHandler implements CXFUndertowHttpHandler {
     @Override
     public void setNext(HttpHandler nextHandler) {
         this.next = nextHandler;
-
+        
     }
-
+    
     private void buildLogHandler() {
         HttpHandler handler = this.next;
         XnioWorker xnioWorker = createWorker(this.getClass().getClassLoader());
-        AccessLogReceiver logReceiver = DefaultAccessLogReceiver.builder().setLogWriteExecutor(xnioWorker)
-            .setOutputDirectory(new File("target").toPath()).setLogBaseName("request.")
-            .setLogNameSuffix("log").setRotate(true).build();
-        this.accessLogHandler = new AccessLogHandler(handler, logReceiver, "combined",
-                                                     AccessLogHandler.class.getClassLoader());
+        if (this.getOutPutDirectory() == null) {
+            this.setOutPutDirectory("./data/log");
+        }
+        if (this.getBaseName() == null) {
+            this.setBaseName("request.");
+        }
+        if (this.getSuffix() == null) {
+            this.setSuffix("log");
+        }
+        if (this.getPattern() == null) {
+            this.setPattern("combined");
+        }
+        AccessLogReceiver logReceiver = DefaultAccessLogReceiver.builder()
+            .setLogWriteExecutor(xnioWorker)
+            .setOutputDirectory(new File(this.getOutPutDirectory()).toPath())
+            .setLogBaseName(this.getBaseName())
+            .setLogNameSuffix(this.getSuffix()).setRotate(true).build();
+        this.accessLogHandler = new AccessLogHandler(handler, logReceiver, this.getPattern(),
+                             AccessLogHandler.class.getClassLoader());
 
     }
-
+    
     public static XnioWorker createWorker(ClassLoader loader) {
         try {
             if (loader == null) {
@@ -78,4 +97,38 @@ public class LogHandler implements CXFUndertowHttpHandler {
             return null;
         }
     }
-}
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public String getOutPutDirectory() {
+        return outPutDirectory;
+    }
+
+    public void setOutPutDirectory(String outPutDirectory) {
+        this.outPutDirectory = outPutDirectory;
+    }
+
+    public String getBaseName() {
+        return baseName;
+    }
+
+    public void setBaseName(String baseName) {
+        this.baseName = baseName;
+    }
+
+    public String getSuffix() {
+        return suffix;
+    }
+
+    public void setSuffix(String suffix) {
+        this.suffix = suffix;
+    }
+
+
+}
\ No newline at end of file
diff --git a/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/undertowBasicAuthServer.xml b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/undertowBasicAuthServer.xml
index d3be533..47c19db 100644
--- a/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/undertowBasicAuthServer.xml
+++ b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/undertowBasicAuthServer.xml
@@ -20,8 +20,14 @@
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:httpu="http://cxf.apache.org/transports/http-undertow/configuration"
-    xsi:schemaLocation="http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+    xmlns:cxf="http://cxf.apache.org/core"
+    xsi:schemaLocation="http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
     <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"/>
+    <cxf:bus name="cxf" id="cxf">
+       <cxf:properties>
+           <entry key="org.apache.cxf.transports.http_undertow.EnableRecordRequestStartTime" value="true"/>
+       </cxf:properties>
+    </cxf:bus>    
     <httpu:engine-factory bus="cxf">
         <httpu:engine port="${testutil.ports.UndertowBasicAuthServer}">
             <httpu:handlers>
@@ -30,7 +36,10 @@
                     <property name="maximumConcurrentRequests" value="1" />
                     <property name="queueSize" value="1"/>
                 </bean>
-                <bean class="org.apache.cxf.systest.http_undertow.LogHandler"/>
+                <bean class="org.apache.cxf.transport.http_undertow.handlers.CxfUndertowLogHandler">
+                    <property name="pattern" value="Time Taken: %T %D %h %l %u %t %r %s %b %I"/>
+                    <property name="outPutDirectory" value="target"/>
+                </bean>
             </httpu:handlers>
         </httpu:engine>
     </httpu:engine-factory>