You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/02/14 01:29:34 UTC
[incubator-servicecomb-java-chassis] 01/08: SCB-338 extract
AccessLogGenerator
This is an automated email from the ASF dual-hosted git repository.
ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit a5642320414ad766f039560dceca2be88746d8dc
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Sun Feb 11 19:28:19 2018 +0800
SCB-338 extract AccessLogGenerator
---
.../vertx/accesslog/AccessLogConfiguration.java | 5 ++-
.../rest/vertx/accesslog/AccessLogGenerator.java | 45 ++++++++++++++++++++
.../vertx/accesslog/impl/AccessLogHandler.java | 32 ++-------------
...andlerTest.java => AccessLogGeneratorTest.java} | 48 ++++------------------
.../vertx/accesslog/impl/AccessLogHandlerTest.java | 40 ------------------
5 files changed, 61 insertions(+), 109 deletions(-)
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogConfiguration.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogConfiguration.java
index 9172095..6f10955 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogConfiguration.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.transport.rest.vertx.accesslog;
import com.netflix.config.DynamicPropertyFactory;
public final class AccessLogConfiguration {
+
private static final String BASE = "servicecomb.accesslog.";
private static final String ACCESSLOG_ENABLED = BASE + "enabled";
@@ -28,6 +29,8 @@ public final class AccessLogConfiguration {
public static final AccessLogConfiguration INSTANCE = new AccessLogConfiguration();
+ public static final String DEFAULT_PATTERN = "%h - - %t %r %s %B";
+
private AccessLogConfiguration() {
}
@@ -37,7 +40,7 @@ public final class AccessLogConfiguration {
}
public String getAccesslogPattern() {
- return getProperty("%h - - %t %r %s %B", ACCESSLOG_PATTERN);
+ return getProperty(DEFAULT_PATTERN, ACCESSLOG_PATTERN);
}
private String getProperty(String defaultValue, String key) {
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogGenerator.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogGenerator.java
new file mode 100644
index 0000000..0541392
--- /dev/null
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogGenerator.java
@@ -0,0 +1,45 @@
+package org.apache.servicecomb.transport.rest.vertx.accesslog;
+
+import java.util.List;
+
+import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogElement;
+import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogElementExtraction;
+import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogPatternParser;
+
+/**
+ * Accept {@link AccessLogParam} and generate access log.
+ * <br/>
+ * Each AccessLogParam for a line of access log.
+ */
+public class AccessLogGenerator {
+ /**
+ * traversal this array to generate access log segment.
+ */
+ private AccessLogElement[] accessLogElements;
+
+ public AccessLogGenerator(String rawPattern, AccessLogPatternParser accessLogPatternParser) {
+ List<AccessLogElementExtraction> extractionList = accessLogPatternParser.parsePattern(rawPattern);
+
+ accessLogElements = new AccessLogElement[extractionList.size()];
+ for (int i = 0; i < extractionList.size(); ++i) {
+ accessLogElements[i] = extractionList.get(i).getAccessLogElement();
+ }
+ }
+
+ public String generateLog(AccessLogParam accessLogParam) {
+ StringBuilder log = new StringBuilder(128);
+ accessLogParam.setEndMillisecond(System.currentTimeMillis());
+
+ AccessLogElement[] accessLogElements = getAccessLogElements();
+ for (int i = 0; i < accessLogElements.length; ++i) {
+ log.append(accessLogElements[i].getFormattedElement(accessLogParam));
+ }
+
+ return log.toString();
+ }
+
+
+ private AccessLogElement[] getAccessLogElements() {
+ return accessLogElements;
+ }
+}
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 3424c4d..bc77a30 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
@@ -17,11 +17,8 @@
package org.apache.servicecomb.transport.rest.vertx.accesslog.impl;
-import java.util.List;
-
+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.AccessLogElement;
-import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogElementExtraction;
import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogPatternParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,15 +29,10 @@ import io.vertx.ext.web.RoutingContext;
public class AccessLogHandler implements Handler<RoutingContext> {
private static Logger LOGGER = LoggerFactory.getLogger("accesslog");
- private static AccessLogElement[] accessLogElements;
+ private AccessLogGenerator accessLogGenerator;
public AccessLogHandler(String rawPattern, AccessLogPatternParser accessLogPatternParser) {
- List<AccessLogElementExtraction> extractionList = accessLogPatternParser.parsePattern(rawPattern);
-
- accessLogElements = new AccessLogElement[extractionList.size()];
- for (int i = 0; i < extractionList.size(); ++i) {
- accessLogElements[i] = extractionList.get(i).getAccessLogElement();
- }
+ accessLogGenerator = new AccessLogGenerator(rawPattern, accessLogPatternParser);
}
@Override
@@ -48,24 +40,8 @@ public class AccessLogHandler implements Handler<RoutingContext> {
AccessLogParam accessLogParam = new AccessLogParam().setStartMillisecond(System.currentTimeMillis())
.setRoutingContext(context);
- context.addBodyEndHandler(v -> log(accessLogParam));
+ context.addBodyEndHandler(v -> LOGGER.info(accessLogGenerator.generateLog(accessLogParam)));
context.next();
}
-
- private void log(AccessLogParam accessLogParam) {
- StringBuilder log = new StringBuilder(128);
- accessLogParam.setEndMillisecond(System.currentTimeMillis());
-
- AccessLogElement[] accessLogElements = getAccessLogElements();
- for (int i = 0; i < accessLogElements.length; ++i) {
- log.append(accessLogElements[i].getFormattedElement(accessLogParam));
- }
-
- LOGGER.info(log.toString());
- }
-
- private AccessLogElement[] getAccessLogElements() {
- return accessLogElements;
- }
}
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/AccessLogGeneratorTest.java
similarity index 58%
copy from transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/impl/AccessLogHandlerTest.java
copy to transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/AccessLogGeneratorTest.java
index a4e3337..f7747fe 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/AccessLogGeneratorTest.java
@@ -1,21 +1,4 @@
-/*
- * 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.servicecomb.transport.rest.vertx.accesslog.impl;
+package org.apache.servicecomb.transport.rest.vertx.accesslog;
import static org.junit.Assert.assertEquals;
@@ -23,23 +6,21 @@ import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.TimeZone;
-import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogParam;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.DatetimeConfigurableElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.MethodElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.PlainTextElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogElementExtraction;
-import org.junit.BeforeClass;
+import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
-import org.slf4j.Logger;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
import mockit.Deencapsulation;
-public class AccessLogHandlerTest {
+public class AccessLogGeneratorTest {
private static final AccessLogElement methodElement = new MethodElement();
@@ -47,23 +28,16 @@ public class AccessLogHandlerTest {
private static final AccessLogElement plainTextElement = new PlainTextElement(" - ");
- private static final Logger logger = Mockito.mock(Logger.class);
-
- private static final AccessLogHandler ACCESS_LOG_HANDLER = new AccessLogHandler("rawPattern", s -> {
+ private static final AccessLogGenerator ACCESS_LOG_GENERATOR = new AccessLogGenerator("rawPattern", s -> {
assertEquals("rawPattern", s);
return Arrays.asList(new AccessLogElementExtraction().setAccessLogElement(methodElement),
new AccessLogElementExtraction().setAccessLogElement(plainTextElement),
new AccessLogElementExtraction().setAccessLogElement(datetimeElement));
});
- @BeforeClass
- public static void init() {
- Deencapsulation.setField(AccessLogHandler.class, "LOGGER", logger);
- }
-
@Test
public void testConstructor() {
- AccessLogElement[] elements = Deencapsulation.getField(ACCESS_LOG_HANDLER, "accessLogElements");
+ AccessLogElement[] elements = Deencapsulation.getField(ACCESS_LOG_GENERATOR, "accessLogElements");
assertEquals(3, elements.length);
assertEquals(methodElement, elements[0]);
assertEquals(plainTextElement, elements[1]);
@@ -71,12 +45,6 @@ public class AccessLogHandlerTest {
}
@Test
- public void handle() {
- RoutingContext testContext = Mockito.mock(RoutingContext.class);
- ACCESS_LOG_HANDLER.handle(testContext);
- }
-
- @Test
public void testLog() {
RoutingContext context = Mockito.mock(RoutingContext.class);
HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
@@ -90,8 +58,8 @@ public class AccessLogHandlerTest {
Mockito.when(context.request()).thenReturn(request);
Mockito.when(request.method()).thenReturn(HttpMethod.DELETE);
- Deencapsulation.invoke(ACCESS_LOG_HANDLER, "log", accessLogParam);
+ String log = ACCESS_LOG_GENERATOR.generateLog(accessLogParam);
- Mockito.verify(logger).info("DELETE" + " - " + simpleDateFormat.format(startMillisecond));
+ Assert.assertEquals("DELETE" + " - " + simpleDateFormat.format(startMillisecond), log);
}
-}
+}
\ No newline at end of file
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 a4e3337..d907a15 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
@@ -19,25 +19,18 @@ package org.apache.servicecomb.transport.rest.vertx.accesslog.impl;
import static org.junit.Assert.assertEquals;
-import java.text.SimpleDateFormat;
import java.util.Arrays;
-import java.util.TimeZone;
-import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogParam;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.DatetimeConfigurableElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.MethodElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.PlainTextElement;
import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogElementExtraction;
-import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import org.slf4j.Logger;
-import io.vertx.core.http.HttpMethod;
-import io.vertx.core.http.HttpServerRequest;
import io.vertx.ext.web.RoutingContext;
-import mockit.Deencapsulation;
public class AccessLogHandlerTest {
@@ -56,42 +49,9 @@ public class AccessLogHandlerTest {
new AccessLogElementExtraction().setAccessLogElement(datetimeElement));
});
- @BeforeClass
- public static void init() {
- Deencapsulation.setField(AccessLogHandler.class, "LOGGER", logger);
- }
-
- @Test
- public void testConstructor() {
- AccessLogElement[] elements = Deencapsulation.getField(ACCESS_LOG_HANDLER, "accessLogElements");
- assertEquals(3, elements.length);
- assertEquals(methodElement, elements[0]);
- assertEquals(plainTextElement, elements[1]);
- assertEquals(datetimeElement, elements[2]);
- }
-
@Test
public void handle() {
RoutingContext testContext = Mockito.mock(RoutingContext.class);
ACCESS_LOG_HANDLER.handle(testContext);
}
-
- @Test
- public void testLog() {
- RoutingContext context = Mockito.mock(RoutingContext.class);
- HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
- long startMillisecond = 1416863450581L;
- AccessLogParam accessLogParam = new AccessLogParam().setStartMillisecond(startMillisecond)
- .setRoutingContext(context);
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableElement.DEFAULT_DATETIME_PATTERN,
- DatetimeConfigurableElement.DEFAULT_LOCALE);
- simpleDateFormat.setTimeZone(TimeZone.getDefault());
-
- Mockito.when(context.request()).thenReturn(request);
- Mockito.when(request.method()).thenReturn(HttpMethod.DELETE);
-
- Deencapsulation.invoke(ACCESS_LOG_HANDLER, "log", accessLogParam);
-
- Mockito.verify(logger).info("DELETE" + " - " + simpleDateFormat.format(startMillisecond));
- }
}
--
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.