You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/06/30 03:29:11 UTC

[incubator-servicecomb-java-chassis] branch master updated: [SCB-696] access log print %v correctly in short-lived connections

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 82d4766  [SCB-696] access log print %v correctly in short-lived connections
82d4766 is described below

commit 82d47669ae2486bbd259567b7995cd27dd72061a
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Tue Jun 26 11:49:46 2018 +0800

    [SCB-696] access log print %v correctly in short-lived connections
---
 .../rest/vertx/accesslog/AccessLogParam.java       | 18 +++++++++++++
 .../accesslog/element/impl/LocalHostItem.java      |  4 +++
 .../vertx/accesslog/impl/AccessLogHandler.java     | 11 ++++++--
 .../accesslog/element/impl/LocalHostItemTest.java  | 30 ++++++++++++++--------
 .../vertx/accesslog/impl/AccessLogHandlerTest.java | 15 ++++++-----
 5 files changed, 60 insertions(+), 18 deletions(-)

diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogParam.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogParam.java
index fcc2d4d..809030f 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogParam.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogParam.java
@@ -31,6 +31,14 @@ public class AccessLogParam<T> {
 
   private long endMillisecond;
 
+  /**
+   * If client send request via a short-lived connection, the connection may be closed before the corresponding
+   * access log is generated, and then the
+   * {@linkplain org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.LocalHostItem LocalHostItem}
+   * may get "0.0.0.0" as result. So we need to get local address before the connection is closed.
+   */
+  private String localAddress;
+
   public T getContextData() {
     return contextData;
   }
@@ -58,12 +66,22 @@ public class AccessLogParam<T> {
     return this;
   }
 
+  public String getLocalAddress() {
+    return localAddress;
+  }
+
+  public AccessLogParam<T> setLocalAddress(String localAddress) {
+    this.localAddress = localAddress;
+    return this;
+  }
+
   @Override
   public String toString() {
     final StringBuilder sb = new StringBuilder("AccessLogParam{");
     sb.append("contextData=").append(contextData);
     sb.append(", startMillisecond=").append(startMillisecond);
     sb.append(", endMillisecond=").append(endMillisecond);
+    sb.append(", localAddress='").append(localAddress).append('\'');
     sb.append('}');
     return sb.toString();
   }
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItem.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItem.java
index 2206328..cbb1e87 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItem.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItem.java
@@ -31,6 +31,10 @@ public class LocalHostItem implements AccessLogItem<RoutingContext> {
 
   @Override
   public String getFormattedItem(AccessLogParam<RoutingContext> accessLogParam) {
+    return accessLogParam.getLocalAddress();
+  }
+
+  public static String getLocalAddress(AccessLogParam<RoutingContext> accessLogParam) {
     HttpServerRequest request = accessLogParam.getContextData().request();
     if (null == request) {
       return EMPTY_RESULT;
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandler.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandler.java
index 01b5676..0edc7c0 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandler.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandler.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.transport.rest.vertx.accesslog.impl;
 
 import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogGenerator;
 import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogParam;
+import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.LocalHostItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,11 +37,17 @@ public class AccessLogHandler implements Handler<RoutingContext> {
 
   @Override
   public void handle(RoutingContext context) {
-    AccessLogParam<RoutingContext> accessLogParam = new AccessLogParam<>();
-    accessLogParam.setStartMillisecond(System.currentTimeMillis()).setContextData(context);
+    AccessLogParam<RoutingContext> accessLogParam = getRoutingContextAccessLogParam(context);
 
     context.response().endHandler(event -> LOGGER.info(accessLogGenerator.generateLog(accessLogParam)));
 
     context.next();
   }
+
+  private AccessLogParam<RoutingContext> getRoutingContextAccessLogParam(RoutingContext context) {
+    AccessLogParam<RoutingContext> accessLogParam = new AccessLogParam<>();
+    accessLogParam.setStartMillisecond(System.currentTimeMillis()).setContextData(context);
+    accessLogParam.setLocalAddress(LocalHostItem.getLocalAddress(accessLogParam));
+    return accessLogParam;
+  }
 }
diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItemTest.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItemTest.java
index f70c88e..285529d 100644
--- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItemTest.java
+++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/LocalHostItemTest.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogParam;
+import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -32,7 +33,16 @@ public class LocalHostItemTest {
   public static final LocalHostItem ELEMENT = new LocalHostItem();
 
   @Test
-  public void getFormattedElement() {
+  public void getFormattedItem() {
+    String localAddress = "192.168.0.1";
+    AccessLogParam<RoutingContext> accessLogParam = new AccessLogParam<>();
+    accessLogParam.setLocalAddress(localAddress);
+
+    Assert.assertEquals(localAddress, ELEMENT.getFormattedItem(accessLogParam));
+  }
+
+  @Test
+  public void getLocalAddress() {
     AccessLogParam<RoutingContext> param = new AccessLogParam<>();
     RoutingContext context = Mockito.mock(RoutingContext.class);
     HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
@@ -44,26 +54,26 @@ public class LocalHostItemTest {
     Mockito.when(request.localAddress()).thenReturn(localAddress);
     Mockito.when(localAddress.host()).thenReturn(localHost);
 
-    String result = ELEMENT.getFormattedItem(param);
+    String result = LocalHostItem.getLocalAddress(param);
 
     assertEquals(localHost, result);
   }
 
   @Test
-  public void getFormattedElementOnRequestIsNull() {
+  public void getLocalAddressOnRequestIsNull() {
     AccessLogParam<RoutingContext> param = new AccessLogParam<>();
     RoutingContext context = Mockito.mock(RoutingContext.class);
 
     param.setContextData(context);
     Mockito.when(context.request()).thenReturn(null);
 
-    String result = ELEMENT.getFormattedItem(param);
+    String result = LocalHostItem.getLocalAddress(param);
 
     assertEquals("-", result);
   }
 
   @Test
-  public void getFormattedElementOnLocalAddressIsNull() {
+  public void getLocalAddressOnLocalAddressIsNull() {
     AccessLogParam<RoutingContext> param = new AccessLogParam<>();
     RoutingContext context = Mockito.mock(RoutingContext.class);
     HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
@@ -72,13 +82,13 @@ public class LocalHostItemTest {
     Mockito.when(context.request()).thenReturn(request);
     Mockito.when(request.localAddress()).thenReturn(null);
 
-    String result = ELEMENT.getFormattedItem(param);
+    String result = LocalHostItem.getLocalAddress(param);
 
     assertEquals("-", result);
   }
 
   @Test
-  public void getFormattedElementOnHostIsNull() {
+  public void getLocalAddressOnHostIsNull() {
     AccessLogParam<RoutingContext> param = new AccessLogParam<>();
     RoutingContext context = Mockito.mock(RoutingContext.class);
     HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
@@ -89,13 +99,13 @@ public class LocalHostItemTest {
     Mockito.when(request.localAddress()).thenReturn(localAddress);
     Mockito.when(localAddress.host()).thenReturn(null);
 
-    String result = ELEMENT.getFormattedItem(param);
+    String result = LocalHostItem.getLocalAddress(param);
 
     assertEquals("-", result);
   }
 
   @Test
-  public void getFormattedElementIsEmpty() {
+  public void getLocalAddressIsEmpty() {
     AccessLogParam<RoutingContext> param = new AccessLogParam<>();
     RoutingContext context = Mockito.mock(RoutingContext.class);
     HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
@@ -107,7 +117,7 @@ public class LocalHostItemTest {
     Mockito.when(request.localAddress()).thenReturn(localAddress);
     Mockito.when(localAddress.host()).thenReturn(localHost);
 
-    String result = ELEMENT.getFormattedItem(param);
+    String result = LocalHostItem.getLocalAddress(param);
 
     assertEquals("-", result);
   }
diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandlerTest.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandlerTest.java
index ce96d49..efd4ee2 100644
--- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandlerTest.java
+++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandlerTest.java
@@ -40,7 +40,7 @@ import mockit.MockUp;
 
 public class AccessLogHandlerTest {
   private static final AccessLogHandler ACCESS_LOG_HANDLER = new AccessLogHandler(
-      "%h - - %s durationMillisecond=[%D] %{test-config}user-defined %{cookie-name}C");
+      "%h - - %s durationMillisecond=[%D] %{test-config}user-defined %{cookie-name}C %v");
 
   private LogCollector logCollector;
 
@@ -73,7 +73,8 @@ public class AccessLogHandlerTest {
       }
     }.getMockInstance();
     HttpServerRequest httpServerRequest = Mockito.mock(HttpServerRequest.class);
-    SocketAddress socketAddress = Mockito.mock(SocketAddress.class);
+    SocketAddress remoteSocketAddress = Mockito.mock(SocketAddress.class);
+    SocketAddress localSocketAddress = Mockito.mock(SocketAddress.class);
 
     Holder<Integer> counter = new Holder<>();
     counter.value = 0;
@@ -93,12 +94,14 @@ public class AccessLogHandlerTest {
     Mockito.when(routingContext.cookies()).thenReturn(cookies);
     Mockito.when(routingContext.response()).thenReturn(httpServerResponse);
     Mockito.when(routingContext.request()).thenReturn(httpServerRequest);
-    Mockito.when(httpServerRequest.remoteAddress()).thenReturn(socketAddress);
-    Mockito.when(socketAddress.host()).thenReturn("localhost");
-
+    Mockito.when(httpServerRequest.remoteAddress()).thenReturn(remoteSocketAddress);
+    Mockito.when(remoteSocketAddress.host()).thenReturn("192.168.0.22");
+    Mockito.when(httpServerRequest.localAddress()).thenReturn(localSocketAddress);
+    Mockito.when(localSocketAddress.host()).thenReturn("192.168.0.33");
     ACCESS_LOG_HANDLER.handle(routingContext);
 
-    Assert.assertEquals("localhost - - 200 durationMillisecond=[122] user-defined-test-config cookie-value",
+    Assert.assertEquals(
+        "192.168.0.22 - - 200 durationMillisecond=[122] user-defined-test-config cookie-value 192.168.0.33",
         logCollector.getEvents().get(0).getMessage());
   }
 }
\ No newline at end of file