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 2020/03/20 07:55:59 UTC

[servicecomb-java-chassis] 04/04: [SCB-1796] support request log : modify as review and support log4j

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/servicecomb-java-chassis.git

commit 034b7cc95ab95f2b4b9d136fc786d4b1f59ebb34
Author: heyile <25...@qq.com>
AuthorDate: Thu Mar 19 10:32:07 2020 +0800

    [SCB-1796] support request log : modify as review and support log4j
---
 .../common-access-log}/pom.xml                     |  10 +-
 .../common/accessLog/AccessLogBootListener.java    |  10 +-
 .../common/accessLog/AccessLogBootstrap.java       |  12 +-
 .../common/accessLog/AccessLogConfig.java          |  10 +-
 .../common/accessLog/AccessLogInitializer.java     |   6 +-
 .../client/ClientDefaultInitializer.java           |  23 +-
 .../common/accessLog/core/AccessLogGenerator.java  |  32 +-
 .../servicecomb/common/accessLog/core/README.md    | 373 +++++++++++++++++++++
 .../accessLog/core/element/AccessLogItem.java      |  15 +-
 .../core/element/impl/CookieItemAccess.java        |  12 +-
 .../impl/DatetimeConfigurableItemAccess.java       |  14 +-
 .../impl/DurationMillisecondItemAccess.java        |  10 +-
 .../element/impl/DurationSecondItemAccess.java     |  12 +-
 .../element/impl/FirstLineOfRequestItemAccess.java |  28 +-
 .../core/element/impl/HttpMethodItemAccess.java    |  10 +-
 .../core/element/impl/HttpStatusItemAccess.java    |  12 +-
 .../element/impl/InvocationContextItemAccess.java  |  12 +-
 .../core/element/impl/LocalHostItemAccess.java     |  26 +-
 .../core/element/impl/LocalPortItemAccess.java     |  23 +-
 .../core/element/impl/PlainTextItemAccess.java     |  12 +-
 .../core/element/impl/QueryStringItemAccess.java   |  13 +-
 .../core/element/impl/RemoteHostItemAccess.java    |  10 +-
 .../core/element/impl/RequestHeaderItemAccess.java |  13 +-
 .../element/impl/RequestProtocolItemAccess.java    |  23 +-
 .../element/impl/ResponseHeaderItemAccess.java     |  12 +-
 .../core/element/impl/ResponseSizeItemAccess.java  |  12 +-
 .../core/element/impl/TraceIdItemAccess.java       |  14 +-
 .../core/element/impl/TransportItemAccess.java     |  15 +-
 .../core/element/impl/UrlPathItemAccess.java       |  10 +-
 .../element/impl/UrlPathWithQueryItemAccess.java   |  10 +-
 .../core/parser/AccessLogItemCreator.java          |  18 +-
 .../accessLog/core/parser/AccessLogItemMeta.java   |  22 +-
 .../core/parser/AccessLogPatternParser.java        |  17 +-
 .../CompositeVertxRestAccessLogItemMeta.java       |   8 +-
 .../core/parser/VertxRestAccessLogItemMeta.java    |  22 +-
 ...DefaultCompositeVertxRestAccessLogItemMeta.java |  90 +++++
 .../impl/VertxRestAccessLogPatternParser.java      |  83 +++--
 .../core/placeholder/AccessLogItemTypeEnum.java    |   4 +-
 .../server/ServerDefaultInitializer.java           |  21 +-
 ...rvicecomb.common.accessLog.AccessLogInitializer |   4 +-
 ...ccessLog.core.parser.VertxRestAccessLogItemMeta |   2 +-
 .../org.apache.servicecomb.core.BootListener       |   2 +-
 .../main/resources/config/base/log4j.properties    |  13 +
 .../common/accessLog/core/AccessLogConfigTest.java |  14 +-
 .../accessLog/core/AccessLogGeneratorTest.java     |  45 ++-
 .../core/element/impl/CookieItemTest.java          |  20 +-
 .../element/impl/DatetimeConfigurableItemTest.java |  62 ++--
 .../element/impl/DurationMillisecondItemTest.java  |   8 +-
 .../core/element/impl/DurationSecondItemTest.java  |  16 +-
 .../element/impl/FirstLineOfRequestItemTest.java   |  12 +-
 .../core/element/impl/HttpMethodItemTest.java      |  16 +-
 .../core/element/impl/HttpStatusItemTest.java      |  14 +-
 .../element/impl/InvocationContextItemTest.java    |  36 +-
 .../core/element/impl/LocalHostItemTest.java       | 185 ++++++++++
 .../core/element/impl/LocalPortItemTest.java       |  63 +++-
 .../core/element/impl/PlainTextItemTest.java       |  10 +-
 .../core/element/impl/QueryStringItemTest.java     |  20 +-
 .../core/element/impl/RemoteHostItemTest.java      |  24 +-
 .../core/element/impl/RequestHeaderItemTest.java   |  14 +-
 .../core/element/impl/RequestProtocolItemTest.java |  28 +-
 .../core/element/impl/ResponseHeaderItemTest.java  |  20 +-
 .../core/element/impl/ResponseSizeItemTest.java    |  12 +-
 .../core/element/impl/TraceIdItemTest.java         |  22 +-
 .../core/element/impl/TransportItemTest.java       |  18 +-
 .../core/element/impl/UrlPathItemTest.java         |  18 +-
 .../element/impl/UrlPathWithQueryItemTest.java     |  20 +-
 .../impl/UserDefinedAccessAccessLogItem.java       |  12 +-
 .../UserDefinedAccessAccessLogItemLowPriority.java |  12 +-
 ...stCompositeExtendedAccessAccessLogItemMeta.java |  16 +-
 .../TestSingleExtendedAccessAccessLogItemMeta.java |  13 +-
 .../impl/VertxRestAccessLogPatternParserTest.java  | 362 ++++++++++++++++++++
 ...ccessLog.core.parser.VertxRestAccessLogItemMeta |   4 +-
 common/pom.xml                                     |   1 +
 dependencies/default/pom.xml                       |  10 +-
 .../servicecomb/foundation/log/core/README.md      |  75 -----
 .../impl/DefaultCompositeVertxRestLogItemMeta.java |  89 -----
 .../log/core/element/impl/LocalHostItemTest.java   | 120 -------
 .../impl/VertxRestAccessLogPatternParserTest.java  | 362 --------------------
 .../transport-rest/transport-rest-vertx/pom.xml    |   8 +-
 .../transport/rest/vertx/RestServerVerticle.java   |  11 +-
 80 files changed, 1677 insertions(+), 1215 deletions(-)

diff --git a/foundations/foundation-log/pom.xml b/common/common-access-log/pom.xml
similarity index 84%
rename from foundations/foundation-log/pom.xml
rename to common/common-access-log/pom.xml
index 4d229a9..d0a2d69 100644
--- a/foundations/foundation-log/pom.xml
+++ b/common/common-access-log/pom.xml
@@ -19,14 +19,14 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>foundations</artifactId>
+    <artifactId>common</artifactId>
     <groupId>org.apache.servicecomb</groupId>
     <version>2.0.1-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>foundation-log</artifactId>
-  <name>Java Chassis::Foundations::Log</name>
+  <artifactId>common-access-log</artifactId>
+  <name>Java Chassis::Common::CommonAccessLog</name>
 
   <dependencies>
     <dependency>
@@ -35,6 +35,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>common-rest</artifactId>
     </dependency>
   </dependencies>
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogBootListener.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogBootListener.java
similarity index 79%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogBootListener.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogBootListener.java
index 2be8cb2..e84724c 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogBootListener.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogBootListener.java
@@ -15,22 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log;
+package org.apache.servicecomb.common.accessLog;
 
 import org.apache.servicecomb.core.BootListener;
 import org.apache.servicecomb.foundation.common.event.EventManager;
 
-public class LogBootListener implements BootListener {
+public class AccessLogBootListener implements BootListener {
 
-  private LogBootstrap logBootstrap = new LogBootstrap();
+  private AccessLogBootstrap accessLogBootstrap = new AccessLogBootstrap();
 
   @Override
   public void onAfterRegistry(BootEvent event) {
-    logBootstrap.start(EventManager.getEventBus());
+    accessLogBootstrap.start(EventManager.getEventBus());
   }
 
   @Override
   public void onBeforeClose(BootEvent event) {
-    logBootstrap.shutdown();
+    accessLogBootstrap.shutdown();
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogBootstrap.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogBootstrap.java
similarity index 77%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogBootstrap.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogBootstrap.java
index f8493f4..e46542e 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogBootstrap.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogBootstrap.java
@@ -15,25 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log;
+package org.apache.servicecomb.common.accessLog;
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 
 import com.google.common.eventbus.EventBus;
 
-public class LogBootstrap {
-  private static LogConfig config = LogConfig.INSTANCE;
+public class AccessLogBootstrap {
+  private static AccessLogConfig config = AccessLogConfig.INSTANCE;
 
   private EventBus eventBus;
 
   public void start(EventBus eventBus) {
     this.eventBus = eventBus;
-    SPIServiceUtils.getSortedService(LogInitializer.class)
+    SPIServiceUtils.getSortedService(AccessLogInitializer.class)
         .forEach(initializer -> initializer.init(eventBus, config));
   }
 
   public void shutdown() {
-    SPIServiceUtils.getSortedService(LogInitializer.class)
-        .forEach(LogInitializer::destroy);
+    SPIServiceUtils.getSortedService(AccessLogInitializer.class)
+        .forEach(AccessLogInitializer::destroy);
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogConfig.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java
similarity index 90%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogConfig.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java
index 8b4de90..ce2dc58 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogConfig.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogConfig.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log;
+package org.apache.servicecomb.common.accessLog;
 
 import com.netflix.config.DynamicPropertyFactory;
 
-public class LogConfig {
+public class AccessLogConfig {
 
     private static final String SERVER_BASE = "servicecomb.accesslog.";
 
-    private static final String CLIENT_BASE = "servicecomb.outlog.";
+    private static final String CLIENT_BASE = "servicecomb.accesslog.request.";
 
     private static final String SERVER_LOG_ENABLED = SERVER_BASE + "enabled";
 
@@ -37,7 +37,7 @@ public class LogConfig {
 
     private static final String DEFAULT_CLIENT_PATTERN = "%h %SCB-transport - - %t %r %s %D";
 
-    public static final LogConfig INSTANCE = new LogConfig();
+    public static final AccessLogConfig INSTANCE = new AccessLogConfig();
 
     private boolean serverLogEnabled;
 
@@ -47,7 +47,7 @@ public class LogConfig {
 
     private String clientLogPattern;
 
-    private LogConfig() {
+    private AccessLogConfig() {
         init();
     }
 
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogInitializer.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogInitializer.java
similarity index 85%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogInitializer.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogInitializer.java
index 02f8520..564f043 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/LogInitializer.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/AccessLogInitializer.java
@@ -14,16 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.foundation.log;
+package org.apache.servicecomb.common.accessLog;
 
 import com.google.common.eventbus.EventBus;
 
-public interface LogInitializer {
+public interface AccessLogInitializer {
     default int getOrder() {
         return 0;
     }
 
-    void init(EventBus eventBus, LogConfig logConfig);
+    void init(EventBus eventBus, AccessLogConfig accessLogConfig);
 
     default void destroy() {}
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/client/ClientDefaultInitializer.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java
similarity index 63%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/client/ClientDefaultInitializer.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java
index 2820cc2..113ffc1 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/client/ClientDefaultInitializer.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/client/ClientDefaultInitializer.java
@@ -15,12 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.client;
+package org.apache.servicecomb.common.accessLog.client;
 
+import org.apache.servicecomb.common.accessLog.AccessLogConfig;
+import org.apache.servicecomb.common.accessLog.AccessLogInitializer;
+import org.apache.servicecomb.common.accessLog.core.AccessLogGenerator;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
-import org.apache.servicecomb.foundation.log.LogConfig;
-import org.apache.servicecomb.foundation.log.LogInitializer;
-import org.apache.servicecomb.foundation.log.core.LogGenerator;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,23 +29,23 @@ import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
 
-public class ClientDefaultInitializer implements LogInitializer {
-  private static Logger LOGGER = LoggerFactory.getLogger("outlog");
+public class ClientDefaultInitializer implements AccessLogInitializer {
+  private static Logger LOGGER = LoggerFactory.getLogger("requestlog");
 
-  private LogGenerator logGenerator;
+  private AccessLogGenerator accessLogGenerator;
 
   @Override
-  public void init(EventBus eventBus, LogConfig logConfig) {
-    if (!logConfig.isClientLogEnabled()) {
+  public void init(EventBus eventBus, AccessLogConfig accessLogConfig) {
+    if (!accessLogConfig.isClientLogEnabled()) {
       return;
     }
-    logGenerator = new LogGenerator(logConfig.getClientLogPattern());
+    accessLogGenerator = new AccessLogGenerator(accessLogConfig.getClientLogPattern());
     eventBus.register(this);
   }
 
   @Subscribe
   @AllowConcurrentEvents
   public void onRequestOut(InvocationFinishEvent finishEvent) {
-    LOGGER.info(logGenerator.generateClientLog(finishEvent));
+    LOGGER.info(accessLogGenerator.generateClientLog(finishEvent));
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/LogGenerator.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/AccessLogGenerator.java
similarity index 58%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/LogGenerator.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/AccessLogGenerator.java
index 6933841..cd46209 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/LogGenerator.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/AccessLogGenerator.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core;
+package org.apache.servicecomb.common.accessLog.core;
 
 import java.util.List;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.parser.AccessLogPatternParser;
+import org.apache.servicecomb.common.accessLog.core.parser.impl.VertxRestAccessLogPatternParser;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.apache.servicecomb.foundation.log.core.parser.LogPatternParser;
-import org.apache.servicecomb.foundation.log.core.parser.impl.VertxRestLogPatternParser;
 
 import com.google.common.collect.Iterables;
 
@@ -34,37 +34,37 @@ import io.vertx.ext.web.RoutingContext;
  * <br/>
  * Each AccessLogParam for a line of access log.
  */
-public class LogGenerator {
+public class AccessLogGenerator {
   /*
    * traversal this array to generate access log segment.
    */
-  private LogItem<RoutingContext>[] logItems;
+  private AccessLogItem<RoutingContext>[] accessLogItems;
 
-  private LogPatternParser<RoutingContext> logPatternParser = new VertxRestLogPatternParser();
+  private AccessLogPatternParser<RoutingContext> logPatternParser = new VertxRestAccessLogPatternParser();
 
   @SuppressWarnings("unchecked")
-  public LogGenerator(String rawPattern) {
-    List<LogItem<RoutingContext>> logItemList = logPatternParser.parsePattern(rawPattern);
-    logItems = Iterables.toArray(logItemList, LogItem.class);
+  public AccessLogGenerator(String rawPattern) {
+    List<AccessLogItem<RoutingContext>> accessLogItemList = logPatternParser.parsePattern(rawPattern);
+    accessLogItems = Iterables.toArray(accessLogItemList, AccessLogItem.class);
   }
 
   public String generateServerLog(ServerAccessLogEvent accessLogEvent) {
     StringBuilder log = new StringBuilder(128);
-    for (LogItem<RoutingContext> logItem : getLogItems()) {
-      logItem.appendFormattedItem(accessLogEvent, log);
+    for (AccessLogItem<RoutingContext> accessLogItem : getAccessLogItems()) {
+      accessLogItem.appendServerFormattedItem(accessLogEvent, log);
     }
     return log.toString();
   }
 
   public String generateClientLog(InvocationFinishEvent finishEvent) {
     StringBuilder log = new StringBuilder(128);
-    for (LogItem<RoutingContext> logItem : getLogItems()) {
-      logItem.appendFormattedItem(finishEvent, log);
+    for (AccessLogItem<RoutingContext> accessLogItem : getAccessLogItems()) {
+      accessLogItem.appendClientFormattedItem(finishEvent, log);
     }
     return log.toString();
   }
 
-  private LogItem<RoutingContext>[] getLogItems() {
-    return logItems;
+  private AccessLogItem<RoutingContext>[] getAccessLogItems() {
+    return accessLogItems;
   }
 }
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/README.md b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/README.md
new file mode 100644
index 0000000..7b631e0
--- /dev/null
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/README.md
@@ -0,0 +1,373 @@
+## 概念阐述
+
+ServiceComb提供了基于Vert.x的access log 和 request log功能。当用户使用REST over Vertx通信方式时,可以通过简单的配置启用access log打印功能。当用户 client 端进行远程调用时,可以通过简单的配置启用request log打印功能
+
+## 场景描述
+
+1. 用户在调试服务时可能需要开启access log。在使用REST over servlet通信方式的情况下,可以使用web容器的access log功能;而在使用REST over Vertx通信方式的情况下,可以使用ServiceComb提供的一套access log功能。
+
+2. 用户想要跟踪,记录客户端远程调用信息, 可以开启 request log。request log 同时支持记录 rest 和 highway 远程调用方式。
+
+## 配置说明
+
+### 启用Access Log and Request Log
+
+用户需要在microservice.yaml文件中增加配置以启用access log 和 request log,配置示例如下:
+
+```yaml
+servicecomb:
+  accesslog:
+    enabled: true  ## server 端 启用access log
+    pattern: "%h - - %t %r %s %B %D" ##  server 端 自定义 access log 日志格式
+    request:
+      enabled: true  ## client 端开启 request log
+      pattern: "%h %SCB-transport - - %t %r %s %D" ## client 端自定义 request log 日志格式
+```
+
+_**Access log & Request log 配置项说明**_
+
+| 配置项 | 取值范围 | 默认值 | 说明 |
+| :--- | :--- | :--- | :--- |
+| servicecomb.accesslog.enabled | true/false | **false** | 如果为true则启用access log,否则不启用 |
+| servicecomb.accesslog.pattern | 表示打印格式的字符串 | **"%h - - %t %r %s %B %D"** |  配置项见_**日志元素说明表**_ |
+| servicecomb.accesslog.request.enabled | true/false | **false** | 如果为true则启用request log,否则不启用 |
+| servicecomb.accesslog.request.pattern | 表示打印格式的字符串 | **"%h %SCB-transport - - %t %r %s %D"** |  配置项见_**日志元素说明表**_ |
+
+> _**说明:**_
+>
+> * 以上两个配置项均可省略,若省略则使用默认值。
+
+### 日志格式配置
+
+目前可用的日志元素配置项见 ***日志元素说明表(Apache & W3C)*** 和 ***日志元素说明表(ServiceComb)*** 。
+
+_**日志元素说明表 (Apache & W3C)**_
+
+| 元素名称 | Apache日志格式 | W3C日志格式 | 说明 |
+| :--- | :--- | :--- | :--- |
+| HTTP method | %m | cs-method | - |
+| HTTP status | %s | sc-status | - |
+| Duration in second | %T | - | - |
+| Duration in millisecond | %D | - | - |
+| Remote hostname | %h | - | - |
+| Local hostname | %v | - | - |
+| Local port | %p | - | - |
+| Size of response | %B | - | 如果消息体长度为零则打印"0" |
+| Size of response | %b | - | 如果消息体长度为零则打印"-" |
+| First line of request | %r | - | 包含HTTP Method、Uri、Http版本三部分内容 |
+| URI path | %U | cs-uri-stem | - |
+| Query string | %q | cs-uri-query | - |
+| URI path and query string | - | cs-uri | - |
+| Request protocol | %H | - | - |
+| Datetime the request is received | %t | - | 按照默认设置打印时间戳,格式为"EEE, dd MMM yyyy HH:mm:ss zzz",语言为英文,时区为GMT |
+| Configurable datetime the request is received | %{PATTERN}t | - | 按照指定的格式打印时间戳,语言为英文,时区为GMT |
+| Configurable datetime the request is received | %{PATTERN&#124;TIMEZONE&#124;LOCALE}t | - | 按照指定的格式、语言、时区打印时间戳。允许省略其中的某部分配置(但两个分隔符号"&#124;"不可省略)。 |
+| Request header | %{VARNAME}i | - | 如果没有找到指定的header,则打印"-" |
+| Response header | %{VARNAME}o | - | 如果没有找到指定的header,则打印"-" |
+| Cookie | %{VARNAME}C | - | 如果没有找到指定的cookie,则打印"-" |
+
+_**日志元素说明表(ServiceComb)**_
+
+| Element | Placeholder | Comment |
+| :----   | :---------- | :------ |
+| TraceId | %SCB-traceId | 打印ServiceComb生成的trace id,找不到则打印"-" |
+| Invocation Context | %{VARNAME}SCB-ctx | 打印key为`VARNAME`的invocation context值,找不到则打印"-" |
+| Transport Method | %SCB-transport | 打印当前调用的 **transport method** 。 `rest` 或者 `highway`|
+
+_**Access log 与 Request log的日志元素对比**_
+
+| 元素名称 | Apache&W3C日志格式 | access log |access log 说明 | request log | request log说明 |
+| --- | --- | --- | --- | --- | --- |
+| HTTP method | %m & cs-method | support | - | support | - |
+| HTTP status | %s & sc-status | support | - | support | - |
+| Duration in second | %T | support | - | support | - |
+| Duration in millisecond | %D | support | - | support | - |
+| Remote hostname | %h |  support | - | support | - |
+| Local hostname | %v | support | - | support | - |
+| Local port | %p | support | - | support | - |
+| Size of response | %B | support | 如果消息体长度为零则打印"0" | unsupported| - |
+| Size of response | %b | support | 如果消息体长度为零则打印"-" | unsupported| - |
+| First line of request |  %r | support | 包含HTTP Method、Uri、Http版本三部分内容| support | 包含HTTP Method、Uri、Http版本三部分内容|
+|URI path| %U & cs-uri-stem | support | - | support | - |
+|Query string | %q & cs-uri-query | support | - | support | - |
+|URI path and query string | cs-uri  |  support | - | support | - |
+| Request protocol |  %H | support | - | support | - |
+| Datetime of the request | %t | support | 收到请求的时间。默认格式为"EEE, dd MMM yyyy HH:mm:ss zzz",语言为英文,时区为GMT | support | 发送请求的时间。默认格式为"EEE, dd MMM yyyy HH:mm:ss zzz",语言为英文,时区为GMT|
+|Configurable datetime the request of the request | %{PATTERN}t | support | 收到请求的时间。按照指定的格式打印时间戳,语言为英文,时区为GMT | support | 发送请求的时间。按照指定的格式打印时间戳,语言为英文,时区为GMT|
+|Configurable datetime the request of the request | %{PATTERN&#124;TIMEZONE&#124;LOCALE}t | support | 收到请求的时间。按照指定的格式、语言、时区打印时间戳。允许省略其中的某部分配置(但两个分隔符号"&#124;"不可省略)。| support | 发送请求的时间。按照指定的格式、语言、时区打印时间戳。允许省略其中的某部分配置(但两个分隔符号"&#124;"不可省略)。|
+|Request header | %{VARNAME}i | support | 如果没有找到指定的header,则打印"-" | support | 如果没有找到指定的header,则打印"-" | 
+|Response header | %{VARNAME}o | support | 如果没有找到指定的header,则打印"-"| support | 如果没有找到指定的header,则打印"-" |
+|Cookie | %{VARNAME}C | support |  如果没有找到指定的cookie,则打印"-" | support |  如果没有找到指定的cookie,则打印"-" | 
+|TraceId | %SCB-traceId | support |打印ServiceComb生成的trace id,找不到则打印"-" | support |打印ServiceComb生成的trace id,找不到则打印"-" |
+|Invocation Context | %{VARNAME}SCB-ctx | support | 打印key为`VARNAME`的invocation context值,找不到则打印"-" |support | 打印key为`VARNAME`的invocation context值,找不到则打印"-" |
+|transport method | %SCB-transport | unsupported | 只支持 rest 形式调用 | support | 调用使用的transport method|
+
+
+### 日志输出文件配置
+
+Access log的日志打印实现框架默认采用Log4j,并提供了一套默认的日志文件配置。用户可以在自己定义的log4j.properties文件中覆写这些配置。用户可配置的日志文件配置项见下表。
+
+_**日志文件配置项**_
+
+| 配置项 | 默认值 | 含义 | 说明 |
+| :--- | :--- | :--- | :--- |
+| paas.logs.accesslog.dir | ${paas.logs.dir} | 日志文件输出目录 | 与普通日志输出到同一个目录中 |
+| paas.logs.accesslog.file | access.log | 日志文件名 | - |
+| log4j.appender.access.MaxBackupIndex | 10 | 最大保存的日志滚动文件个数 | - |
+| log4j.appender.access.MaxFileSize | 20MB | 日志文件最大体积 | 正在记录的文件达到此大小时触发日志滚动存储 |
+| log4j.appender.access.logPermission | rw------- | 日志文件权限 | - |
+| paas.logs.requestlog.dir | ${paas.logs.dir} | 日志文件输出目录 | 与普通日志输出到同一个目录中 |
+| paas.logs.requestlog.file | request.log | 日志文件名 | - |
+| log4j.appender.request.MaxBackupIndex | 10 | 最大保存的日志滚动文件个数 | - |
+| log4j.appender.request.MaxFileSize | 20MB | 日志文件最大体积 | 正在记录的文件达到此大小时触发日志滚动存储 |
+| log4j.appender.request.logPermission | rw------- | 日志文件权限 | - |
+
+> _**注意:**_  
+> 由于ServiceComb的日志打印功能只依赖slf4j的接口,因此用户可以选择其他日志打印框架,选择其他日志打印框架时需要用户自行配置日志文件输出选项。
+
+### 日志实现框架切换为logback
+
+> 针对采用logback作为日志打印框架的项目,需要将日志打印框架依赖从Log4j改为logback并添加部分配置以使access log功能正常生效。
+
+#### 1. 排除Log4j依赖
+
+在将日志实现框架切换为logback之前,需要检查项目的依赖,从中排除掉Log4j相关的依赖项。在项目中运行maven命令`dependency:tree`,找出其中依赖了Log4j的ServiceComb组件,在其`<dependency>`依赖项中添加如下配置:
+
+```xml
+<exclusion>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-log4j12</artifactId>
+</exclusion>
+```
+
+#### 2. 添加logback依赖
+
+在pom文件中添加logback的依赖项:
+
+```xml
+<dependency>
+  <groupId>org.slf4j</groupId>
+  <artifactId>slf4j-api</artifactId>
+</dependency>
+<dependency>
+  <groupId>ch.qos.logback</groupId>
+  <artifactId>logback-classic</artifactId>
+</dependency>
+<dependency>
+  <groupId>ch.qos.logback</groupId>
+  <artifactId>logback-core</artifactId>
+</dependency>
+```
+
+#### 3. 配置access log & request log 组件的logger
+
+由于ServiceComb提供的日志打印组件是获取名为`accesslog` & `requestlog` 的logger来打印access log  和 request log ,因此将日志实现框架从Log4j切换为logback的关键就是提供一个名为`accesslog` & `requestlog` 的 Logger,并为其配置好日志输出文件。以下是 **access log** & **request log** 在logback配置文件中的配置示例(本示例仅展示access log & request log相关的配置,其他日志配置均省略):
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+  <!-- 用户可根据需要自定义appender -->
+  <appender name="ACCESSLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>./logs/access.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>./logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
+    </rollingPolicy>
+    <!-- 注意:由于access log的内容是在代码中完成格式化的,因此这里只需输出message即可,无需添加额外的格式 -->
+    <encoder>
+      <pattern>%msg%n</pattern>
+    </encoder>
+  </appender>
+  <appender name="REQUESTLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>./logs/request.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>./logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
+    </rollingPolicy>
+    <!-- 注意:由于request log的内容是在代码中完成格式化的,因此这里只需输出message即可,无需添加额外的格式 -->
+    <encoder>
+      <pattern>%msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <!-- 提供一个名为"accesslog"的logger供access log打印组件使用 -->
+  <logger name="accesslog" level="INFO" additivity="false">
+    <appender-ref ref="ACCESSLOG" />
+  </logger>
+  <!-- 提供一个名为"requestlog"的logger供request log打印组件使用 -->
+  <logger name="requestlog" level="INFO" additivity="false">
+    <appender-ref ref="REQUESTLOG" />
+  </logger>
+
+</configuration>
+```
+
+### 自定义扩展Access Log & Request Log
+
+用户可以利用ServiceComb提供的AccessLogItem扩展机制,定制自己的AccessLogItem, 我们把 Request Log 也当做一种 Access Log。
+
+#### 相关类说明
+
+1.  **AccessLogItem**
+
+```java
+public interface AccessLogItem<T> {
+  // 从Server端获取信息,打印 Access Log 日志
+  default void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  }
+
+  // 从Client 端获取信息, 打印 Request Log
+  default void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+  }
+}
+```
+
+> **AccessLogItem** 的定义如上所示
+>
+> * **Server 端** 每收到一个请求,会触发一次 Access Log 日志打印。**Client 端** 每次对外远程调用结束,会触发一次 Request Log 日志打印。  
+> 
+> * 每次日志打印,SDK 都会遍历有效的 `AccessLogItem` ,调用对应的方法获取此Item生成的Log片段,并将全部片段拼接成一条Log打印到日志文件中。 
+
+
+2. **VertxRestAccessLogItemMeta**
+
+  ```java
+  // pattern占位符前缀
+  protected String prefix;
+  // pattern占位符后缀
+  protected String suffix;
+  // 优先级序号
+  protected int order;
+  // AccessLogItem构造器
+  protected AccessLogItemCreator<RoutingContext> accessLogItemCreator;
+  ```
+  
+`VertxRestAccessLogItemMeta` 包含如上属性,它定义了ServiceComb如何解析pattern字符串以获得特定的AccessLogItem。
+  
+*  如果用户想要定义一个占位符为`%user-defined`的`AccessLogItem`,则需要声明一个`VertxRestAccessLogItemMeta`的子类,设置prefix="%user-defined",suffix=null,当`AccessLogPatternParser`解析到"%user-defined"时,从此meta类中取得`AccessLogItemCreator`创建对应的`AccessLogItem`。**注意**:由于"%user-defined"占位符中没有变量部分,因此调用`AccessLogItemCreator`传入的配置参数为null。
+  
+*  如果用户想要定义一个占位符为`%{VARNAME}user-defined`的`AccessLogItem`,则声明的`VertxRestAccessLogItemMeta`子类中,设置prefix="%{",suffix="}user-defined",当`AccessLogPatternParser`解析到"%{VARNAME}user-defined"时,会截取出"VARNAME"作为配置参数传入`AccessLogItemCreator`,创建一个`AccessLogItem`。
+
+  `VertxRestAccessLogItemMeta`有一个子类`CompositeVertxRestAccessLogItemMeta`,当用户需要定义多个AccessLogItem时,可以将多个`VertxRestAccessLogItemMeta`聚合到`CompositeVertxRestAccessLogItemMeta`中。Parser加载到类型为`CompositeVertxRestAccessLogItemMeta`的AccessLogItemMeta时,会调用其`getAccessLogItemMetas()`方法获得一组AccessLogItemMeta。`VertxRestAccessLogItemMeta`使用SPI机制加载,而`CompositeVertxRestAccessLogItemMeta`可以让用户只在SPI配置文件中配置一条记录就加载多条meta信息,给了用户更灵活的选择。
+
+3. **AccessLogItemCreator**
+
+  ```java
+  public interface AccessLogItemCreator<T> {
+    // 接收配置值,返回一个AccessLogItem。如果AccessLogItem的占位符没有可变的配置值部分,则此方法会接收到null。
+    AccessLogItem<T> createItem(String config);
+  }
+  ```
+
+  用户通过设置在自定义的`VertxRestAccessLogItemMeta`中的`AccessLogItemCreator`实例化自己的`AccessLogItem`。由于这是一个函数式接口,当`AccessLogItem`的初始化方式较简单时,可以直接使用Lambda表达式定义Creator,以简化开发。
+
+#### AccessLogItemMeta的匹配规则
+
+AccessLogItemMeta加载进Parser后,会进行一次排序。Parser解析pattern串时会从前到后匹配meta list,总的匹配规则如下:
+
+1. 优先匹配高优先级的meta。
+
+2. 优先匹配有后缀的meta,当匹配上多个有后缀meta时,取前后缀相距最小的一个。
+
+3. 优先匹配占位符长的meta,例如有两个meta,"%abc"和"%a",如果匹配中了"%abc"则直接返回,不再匹配"%a"。
+
+#### 示例说明
+
+1. 扩展自定义AccessLogItem
+
+首先用户需要`AccessLogItem`接口实现自己的item:
+ 
+```java
+  public class UserDefinedAccessLogItem implements AccessLogItem<RoutingContext> {
+    private String config;
+
+    public UserDefinedAccessLogItem(String config) {
+      this.config = config;
+    }
+
+    @Override
+    public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+    builder.append("user-defined--server-")
+        .append(accessLogEvent.getRoutingContext().response().getStatusCode())
+        .append("-")
+        .append(config);
+    }
+    
+    @Override
+    public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+    builder.append("user-server-defined-")
+        .append(clientLogEvent.getResponse().getStatus())
+        .append("-")
+        .append(config);
+    }
+  }
+ ```
+
+2. 定义AccessLogItem的meta类
+
+  继承`VertxRestAccessLogItemMeta`或`CompositeVertxRestAccessLogItemMeta`类,定义AccessLogItem的前后缀等信息:
+  
+```java
+public class UserDefinedCompositeExtendedAccessLogItemMeta extends CompositeVertxRestAccessLogItemMeta {
+private static final List<VertxRestAccessLogItemMeta> META_LIST = new ArrayList<>();
+
+static {
+  META_LIST.add(new VertxRestAccessLogItemMeta("%{", "}user-defined", UserDefinedAccessLogItem::new));
+}
+
+@Override
+public List<VertxRestAccessLogItemMeta> getAccessLogItemMetas() {
+  return META_LIST;
+}
+}
+```
+
+3. 配置SPI加载文件
+
+  在`resources/META-INF/services/`目录下定义一个名为"org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemMeta"的文件,将上一步中定义的meta类完整类名填写到该文件中,供Parser加载meta类。
+
+4. 配置 Access Log的 pattern
+
+```yaml
+# 服务端配置
+servicecomb:
+  accesslog:
+    enabled: true ## 应用作为服务端,开启 Access log
+    pattern: "%{param}user-defined" ## Access log 日志格式
+    request:   
+      enabled: true  ## 应用作为客户端,开启 Request log
+      pattern: "%{param}user-defined" ## Request log 日志格式
+```
+
+以服务端为例, 运行服务触发Access Log打印,假设请求返回状态码是 200,则可以看到Access Log打印内容为 "`user-defined--server-200-param`"。
+
+## 示例代码
+
+### microservice.yaml文件中的配置
+
+```yaml
+## other configurations omitted
+servicecomb:
+  accesslog:
+    enabled: true ## 应用作为服务端,开启 Access log
+    pattern: "%h - - %t %r %s %B %D" ## Access log 日志格式
+    request:   
+      enabled: true  ## 应用作为客户端,开启 Request log
+      pattern: "%h %SCB-transport - - %t %r %s %D" ## Request log 日志格式
+    
+```
+
+### log4j.properties文件中的配置
+
+```properties
+# log configuration item
+paas.logs.dir=../logs/
+paas.logs.accesslog.file=access.log
+paas.logs.requestlog.file=request.log
+# access log File appender
+log4j.appender.access.MaxBackupIndex=10
+log4j.appender.access.MaxFileSize=20MB
+log4j.appender.access.logPermission=rw-------
+# request log File appender
+log4j.appender.request.MaxBackupIndex=10
+log4j.appender.request.MaxFileSize=20MB
+log4j.appender.request.logPermission=rw-------
+```
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/LogItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/AccessLogItem.java
similarity index 67%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/LogItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/AccessLogItem.java
index d52cd97..02fffb2 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/LogItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/AccessLogItem.java
@@ -15,22 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element;
+package org.apache.servicecomb.common.accessLog.core.element;
 
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
 
 /*
- * Access log item represents the items supported in access log printing.
- * It generate the segment of access log according to {@link AccessLogParam}
+ * Access log item represents the items supported in access log and request log printing.
+ * It generate the segment of log according to {@link AccessLogParam}
  */
-public interface LogItem<T> {
-  /*
-   * find out specified content from {@link AccessLogParam}, format the content and return it.
-   */
-  default void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+public interface AccessLogItem<T> {
+  default void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
   }
 
-  default void appendFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+  default void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/CookieItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemAccess.java
similarity index 83%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/CookieItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemAccess.java
index e454d8f..a0965ba 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/CookieItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemAccess.java
@@ -15,32 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.Cookie;
 import io.vertx.ext.web.RoutingContext;
 
-public class CookieItem implements LogItem<RoutingContext> {
+public class CookieItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String RESULT_NOT_FOUND = "-";
 
   private final String varName;
 
-  public CookieItem(String varName) {
+  public CookieItemAccess(String varName) {
     this.varName = varName;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     Map<String, Cookie> cookieMap = accessLogEvent.getRoutingContext().cookieMap();
     if (null == cookieMap) {
       builder.append(RESULT_NOT_FOUND);
@@ -56,7 +56,7 @@ public class CookieItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
       .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
     if (null == restRequestImpl || null == restRequestImpl.getCookieMap()) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DatetimeConfigurableItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemAccess.java
similarity index 88%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DatetimeConfigurableItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemAccess.java
index 4ef94f7..3877361 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DatetimeConfigurableItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemAccess.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 import org.springframework.util.StringUtils;
 
 import io.vertx.ext.web.RoutingContext;
@@ -32,7 +32,7 @@ import io.vertx.ext.web.RoutingContext;
 /**
  * Configurable dateTime element.
  */
-public class DatetimeConfigurableItem implements LogItem<RoutingContext> {
+public class DatetimeConfigurableItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String DEFAULT_DATETIME_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz";
 
@@ -49,7 +49,7 @@ public class DatetimeConfigurableItem implements LogItem<RoutingContext> {
   /**
    * all configuration is set to default value.
    */
-  public DatetimeConfigurableItem() {
+  public DatetimeConfigurableItemAccess() {
     this(DEFAULT_DATETIME_PATTERN);
   }
 
@@ -57,7 +57,7 @@ public class DatetimeConfigurableItem implements LogItem<RoutingContext> {
    * the configurations not specified will get a default value.
    * @param config the format of configuration is "PATTERN|TIMEZONE|LOCALE" or "PATTERN". It depends on whether the config contains the separator "|"
    */
-  public DatetimeConfigurableItem(String config) {
+  public DatetimeConfigurableItemAccess(String config) {
     String[] configArr = null;
     if (config.contains("|")) {
       configArr = splitConfig(config);
@@ -85,12 +85,12 @@ public class DatetimeConfigurableItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     doAppendFormattedItem(accessLogEvent.getMilliStartTime(), builder);
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     long milliDuration = (finishEvent.getInvocation().getInvocationStageTrace().getStartSend() -
         finishEvent.getInvocation().getInvocationStageTrace().getStart()) / 1000_000;
     doAppendFormattedItem(
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationMillisecondItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemAccess.java
similarity index 74%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationMillisecondItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemAccess.java
index c272208..10e9f1e 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationMillisecondItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemAccess.java
@@ -15,22 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
-public class DurationMillisecondItem implements LogItem<RoutingContext> {
+public class DurationMillisecondItemAccess implements AccessLogItem<RoutingContext> {
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append(accessLogEvent.getMilliEndTime() - accessLogEvent.getMilliStartTime());
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     builder.append((finishEvent.getInvocation().getInvocationStageTrace().getFinish() -
         finishEvent.getInvocation().getInvocationStageTrace().getStartSend()) / 1000_000);
   }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationSecondItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemAccess.java
similarity index 69%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationSecondItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemAccess.java
index c468703..def9eea 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationSecondItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemAccess.java
@@ -15,25 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
-public class DurationSecondItem implements LogItem<RoutingContext> {
+public class DurationSecondItemAccess implements AccessLogItem<RoutingContext> {
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append((accessLogEvent.getMilliEndTime() - accessLogEvent.getMilliStartTime()) / 1000);
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     builder.append((finishEvent.getInvocation().getInvocationStageTrace().getFinish() -
-      finishEvent.getInvocation().getInvocationStageTrace().getStartSend()) / 1000_000_000);
+        finishEvent.getInvocation().getInvocationStageTrace().getStartSend()) / 1000_000_000);
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/FirstLineOfRequestItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemAccess.java
similarity index 51%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/FirstLineOfRequestItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemAccess.java
index 0f504ad..95b7831 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/FirstLineOfRequestItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemAccess.java
@@ -15,40 +15,40 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
-public class FirstLineOfRequestItem implements LogItem<RoutingContext> {
-  private static final HttpMethodItem METHOD_ELEMENT = new HttpMethodItem();
+public class FirstLineOfRequestItemAccess implements AccessLogItem<RoutingContext> {
+  private static final HttpMethodItemAccess METHOD_ELEMENT = new HttpMethodItemAccess();
 
-  private static final UrlPathItem URI_PATH_ONLY_ELEMENT = new UrlPathItem();
+  private static final UrlPathItemAccess URI_PATH_ONLY_ELEMENT = new UrlPathItemAccess();
 
-  private static final RequestProtocolItem VERSION_OR_PROTOCOL_ELEMENT = new RequestProtocolItem();
+  private static final RequestProtocolItemAccess VERSION_OR_PROTOCOL_ELEMENT = new RequestProtocolItemAccess();
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append("\"");
-    METHOD_ELEMENT.appendFormattedItem(accessLogEvent, builder);
+    METHOD_ELEMENT.appendServerFormattedItem(accessLogEvent, builder);
     builder.append(" ");
-    URI_PATH_ONLY_ELEMENT.appendFormattedItem(accessLogEvent, builder);
+    URI_PATH_ONLY_ELEMENT.appendServerFormattedItem(accessLogEvent, builder);
     builder.append(" ");
-    VERSION_OR_PROTOCOL_ELEMENT.appendFormattedItem(accessLogEvent, builder);
+    VERSION_OR_PROTOCOL_ELEMENT.appendServerFormattedItem(accessLogEvent, builder);
     builder.append("\"");
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     builder.append("\"");
-    METHOD_ELEMENT.appendFormattedItem(finishEvent, builder);
+    METHOD_ELEMENT.appendClientFormattedItem(finishEvent, builder);
     builder.append(" ");
-    URI_PATH_ONLY_ELEMENT.appendFormattedItem(finishEvent, builder);
+    URI_PATH_ONLY_ELEMENT.appendClientFormattedItem(finishEvent, builder);
     builder.append(" ");
-    VERSION_OR_PROTOCOL_ELEMENT.appendFormattedItem(finishEvent, builder);
+    VERSION_OR_PROTOCOL_ELEMENT.appendClientFormattedItem(finishEvent, builder);
     builder.append("\"");
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpMethodItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemAccess.java
similarity index 84%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpMethodItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemAccess.java
index 521d770..021cb4d 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpMethodItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemAccess.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
@@ -32,12 +32,12 @@ import io.vertx.ext.web.RoutingContext;
 /**
  * HTTP method
  */
-public class HttpMethodItem implements LogItem<RoutingContext> {
+public class HttpMethodItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || null == request.method()) {
       builder.append(EMPTY_RESULT);
@@ -47,7 +47,7 @@ public class HttpMethodItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     OperationMeta operationMeta = finishEvent.getInvocation().getOperationMeta();
     if (operationMeta != null && !StringUtils.isEmpty(operationMeta.getHttpMethod())) {
       builder.append(operationMeta.getHttpMethod());
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpStatusItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusItemAccess.java
similarity index 81%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpStatusItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusItemAccess.java
index 4d7cf70..67fe458 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpStatusItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusItemAccess.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,13 +27,13 @@ import org.slf4j.LoggerFactory;
 import io.vertx.core.http.HttpServerResponse;
 import io.vertx.ext.web.RoutingContext;
 
-public class HttpStatusItem implements LogItem<RoutingContext> {
-  private static Logger LOGGER = LoggerFactory.getLogger(HttpStatusItem.class);
+public class HttpStatusItemAccess implements AccessLogItem<RoutingContext> {
+  private static Logger LOGGER = LoggerFactory.getLogger(HttpStatusItemAccess.class);
 
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerResponse response = accessLogEvent.getRoutingContext().response();
     if (null == response) {
       builder.append(EMPTY_RESULT);
@@ -50,7 +50,7 @@ public class HttpStatusItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     Response response = finishEvent.getResponse();
     if (null == response) {
       builder.append(EMPTY_RESULT);
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/InvocationContextItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/InvocationContextItemAccess.java
similarity index 82%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/InvocationContextItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/InvocationContextItemAccess.java
index 483faff..b96131f 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/InvocationContextItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/InvocationContextItemAccess.java
@@ -15,31 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import java.util.Map;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 import org.springframework.util.StringUtils;
 
 import io.vertx.ext.web.RoutingContext;
 
-public class InvocationContextItem implements LogItem<RoutingContext> {
+public class InvocationContextItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String NOT_FOUND = "-";
 
   String varName;
 
-  public InvocationContextItem(String varName) {
+  public InvocationContextItemAccess(String varName) {
     this.varName = varName;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     String invocationContextValue = getValueFromInvocationContext(accessLogEvent);
     if (StringUtils.isEmpty(invocationContextValue)) {
       builder.append(NOT_FOUND);
@@ -49,7 +49,7 @@ public class InvocationContextItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     Invocation invocation = finishEvent.getInvocation();
     if (null == invocation || invocation.getContext() == null
         || StringUtils.isEmpty(finishEvent.getInvocation().getContext().get(varName))) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalHostItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemAccess.java
similarity index 55%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalHostItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemAccess.java
index b62f07d..8581e2a 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalHostItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemAccess.java
@@ -15,23 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.rest.RestConst;
+import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.springframework.util.StringUtils;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
-public class LocalHostItem implements LogItem<RoutingContext> {
-
+public class LocalHostItemAccess implements AccessLogItem<RoutingContext> {
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append(accessLogEvent.getLocalAddress());
   }
 
@@ -39,8 +40,17 @@ public class LocalHostItem implements LogItem<RoutingContext> {
    * client do not need localhost
    */
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
-    builder.append(EMPTY_RESULT);
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+    RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+        .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
+    if (null == restRequestImpl || null == restRequestImpl.getRequest()
+        || null == restRequestImpl.getRequest().connection()
+        || null == restRequestImpl.getRequest().connection().localAddress()
+        || StringUtils.isEmpty(restRequestImpl.getRequest().connection().localAddress().host())) {
+      builder.append(EMPTY_RESULT);
+      return;
+    }
+    builder.append(restRequestImpl.getRequest().connection().localAddress().host());
   }
 
   public static String getLocalAddress(RoutingContext context) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalPortItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemAccess.java
similarity index 55%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalPortItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemAccess.java
index e78c192..38b7ca8 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalPortItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemAccess.java
@@ -15,22 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.rest.RestConst;
+import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
-public class LocalPortItem implements LogItem<RoutingContext> {
+public class LocalPortItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || null == request.localAddress()) {
       builder.append(EMPTY_RESULT);
@@ -39,9 +41,16 @@ public class LocalPortItem implements LogItem<RoutingContext> {
     builder.append(request.localAddress().port());
   }
 
-  // client do not need local port
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
-    builder.append(EMPTY_RESULT);
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+    RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
+        .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
+    if (null == restRequestImpl || null == restRequestImpl.getRequest()
+        || null == restRequestImpl.getRequest().connection()
+        || null == restRequestImpl.getRequest().connection().localAddress()) {
+      builder.append(EMPTY_RESULT);
+      return;
+    }
+    builder.append(restRequestImpl.getRequest().connection().localAddress().port());
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/PlainTextItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/PlainTextItemAccess.java
similarity index 71%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/PlainTextItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/PlainTextItemAccess.java
index 88d99a8..ff8d56b 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/PlainTextItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/PlainTextItemAccess.java
@@ -15,32 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
 /**
  * Print content as it is.
  */
-public class PlainTextItem implements LogItem<RoutingContext> {
+public class PlainTextItemAccess implements AccessLogItem<RoutingContext> {
   private final String content;
 
-  public PlainTextItem(String content) {
+  public PlainTextItemAccess(String content) {
     this.content = content;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append(content);
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     builder.append(content);
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/QueryStringItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemAccess.java
similarity index 79%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/QueryStringItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemAccess.java
index b20ea8a..171697a 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/QueryStringItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemAccess.java
@@ -15,24 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
-public class QueryStringItem implements LogItem<RoutingContext> {
-
+public class QueryStringItemAccess implements AccessLogItem<RoutingContext> {
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || StringUtils.isEmpty(request.query())) {
       builder.append(EMPTY_RESULT);
@@ -42,9 +41,9 @@ public class QueryStringItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) finishEvent.getInvocation().getHandlerContext()
-      .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
+        .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
     if (null == restRequestImpl || null == restRequestImpl.getRequest()
         || StringUtils.isEmpty(restRequestImpl.getRequest().query())) {
       builder.append(EMPTY_RESULT);
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RemoteHostItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RemoteHostItemAccess.java
similarity index 82%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RemoteHostItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RemoteHostItemAccess.java
index a53152b..6b21bac 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RemoteHostItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RemoteHostItemAccess.java
@@ -15,24 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
-public class RemoteHostItem implements LogItem<RoutingContext> {
+public class RemoteHostItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || null == request.remoteAddress()
         || StringUtils.isEmpty(request.remoteAddress().host())) {
@@ -43,7 +43,7 @@ public class RemoteHostItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
     Endpoint endpoint = clientLogEvent.getInvocation().getEndpoint();
     if (null == endpoint || null == endpoint.getAddress()
         || StringUtils.isEmpty(((URIEndpointObject) endpoint.getAddress()).getHostOrIp())) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestHeaderItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemAccess.java
similarity index 81%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestHeaderItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemAccess.java
index 305493e..fb05527 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestHeaderItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemAccess.java
@@ -15,30 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 import org.springframework.util.StringUtils;
 
 import io.vertx.core.MultiMap;
 import io.vertx.ext.web.RoutingContext;
 
-public class RequestHeaderItem implements LogItem<RoutingContext> {
-
+public class RequestHeaderItemAccess implements AccessLogItem<RoutingContext> {
   public static final String RESULT_NOT_FOUND = "-";
 
   private final String varName;
 
-  public RequestHeaderItem(String varName) {
+  public RequestHeaderItemAccess(String varName) {
     this.varName = varName;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     MultiMap headers = accessLogEvent.getRoutingContext().request().headers();
     if (null == headers || StringUtils.isEmpty(headers.get(varName))) {
       builder.append(RESULT_NOT_FOUND);
@@ -48,7 +47,7 @@ public class RequestHeaderItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
     RestClientRequestImpl restRequestImpl = (RestClientRequestImpl) clientLogEvent.getInvocation().getHandlerContext()
         .get(RestConst.INVOCATION_HANDLER_REQUESTCLIENT);
     if (null == restRequestImpl || null == restRequestImpl.getRequest()
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestProtocolItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestProtocolItemAccess.java
similarity index 66%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestProtocolItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestProtocolItemAccess.java
index 22d9216..39be17c 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestProtocolItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestProtocolItemAccess.java
@@ -15,25 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
-import org.apache.servicecomb.core.Endpoint;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.core.http.HttpVersion;
 import io.vertx.ext.web.RoutingContext;
 
-public class RequestProtocolItem implements LogItem<RoutingContext> {
-
+public class RequestProtocolItemAccess implements AccessLogItem<RoutingContext> {
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || null == request.version()) {
       builder.append(EMPTY_RESULT);
@@ -43,13 +42,15 @@ public class RequestProtocolItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
-    Endpoint endpoint = finishEvent.getInvocation().getEndpoint();
-    if (endpoint == null || endpoint.getAddress() == null) {
-      builder.append(EMPTY_RESULT);
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+    Invocation invocation = finishEvent.getInvocation();
+    if (invocation == null || null == invocation.getEndpoint() || null == invocation.getEndpoint().getAddress()
+        || !(invocation.getEndpoint().getAddress() instanceof URIEndpointObject)
+        || !((URIEndpointObject) invocation.getEndpoint().getAddress()).isHttp2Enabled()) {
+      builder.append("HTTP/1.1");
       return;
     }
-    builder.append(((URIEndpointObject) endpoint.getAddress()).isSslEnabled() ? "HTTPS" : "HTTP");
+    builder.append("HTTP/2.0");
   }
 
   private String getStringVersion(HttpVersion version) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseHeaderItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemAccess.java
similarity index 80%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseHeaderItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemAccess.java
index 8febdfa..35f0d6c 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseHeaderItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemAccess.java
@@ -15,29 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 import org.apache.servicecomb.swagger.invocation.Response;
 
 import io.vertx.core.http.HttpServerResponse;
 import io.vertx.ext.web.RoutingContext;
 
-public class ResponseHeaderItem implements LogItem<RoutingContext> {
+public class ResponseHeaderItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String RESULT_NOT_FOUND = "-";
 
   private final String varName;
 
-  public ResponseHeaderItem(String varName) {
+  public ResponseHeaderItemAccess(String varName) {
     this.varName = varName;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerResponse response = accessLogEvent.getRoutingContext().response();
     if (null == response || null == response.headers() || StringUtils.isEmpty(response.headers().get(varName))) {
       builder.append(RESULT_NOT_FOUND);
@@ -47,7 +47,7 @@ public class ResponseHeaderItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     Response response = finishEvent.getResponse();
     if (null == response || null == response.getHeaders() || null == response.getHeaders().getFirst(varName)) {
       builder.append(RESULT_NOT_FOUND);
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseSizeItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseSizeItemAccess.java
similarity index 76%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseSizeItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseSizeItemAccess.java
index 1e00309..8337b74 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseSizeItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseSizeItemAccess.java
@@ -15,25 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerResponse;
 import io.vertx.ext.web.RoutingContext;
 
-public class ResponseSizeItem implements LogItem<RoutingContext> {
+public class ResponseSizeItemAccess implements AccessLogItem<RoutingContext> {
   // print zeroBytes when bytes is zero
   private final String zeroBytes;
 
-  public ResponseSizeItem(String zeroBytesPlaceholder) {
+  public ResponseSizeItemAccess(String zeroBytesPlaceholder) {
     zeroBytes = zeroBytesPlaceholder;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerResponse response = accessLogEvent.getRoutingContext().response();
     if (null == response || 0 == response.bytesWritten()) {
       builder.append(zeroBytes);
@@ -43,7 +43,7 @@ public class ResponseSizeItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     /**
      * client do not know how to calculate is right, maybe Object#toString().length
      */
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/TraceIdItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemAccess.java
similarity index 78%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/TraceIdItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemAccess.java
index e1b2761..53a70d0 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/TraceIdItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemAccess.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.core.Const;
@@ -23,29 +23,29 @@ import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
 
-public class TraceIdItem extends InvocationContextItem {
+public class TraceIdItemAccess extends InvocationContextItemAccess {
 
   public static final String TRACE_ID = Const.TRACE_ID_NAME;
 
-  public TraceIdItem() {
+  public TraceIdItemAccess() {
     super(TRACE_ID);
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     String traceId = getValueFromInvocationContext(accessLogEvent);
     if (StringUtils.isEmpty(traceId)) {
       traceId = accessLogEvent.getRoutingContext().request().getHeader(TRACE_ID);
     }
-    builder.append(StringUtils.isEmpty(traceId) ? InvocationContextItem.NOT_FOUND : traceId);
+    builder.append(StringUtils.isEmpty(traceId) ? InvocationContextItemAccess.NOT_FOUND : traceId);
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     Invocation invocation = finishEvent.getInvocation();
     if (invocation == null || invocation.getContext() == null
         || StringUtils.isEmpty(invocation.getContext().get(TRACE_ID))) {
-      builder.append(InvocationContextItem.NOT_FOUND);
+      builder.append(InvocationContextItemAccess.NOT_FOUND);
       return;
     }
     builder.append(invocation.getContext().get(TRACE_ID));
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/TransportItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TransportItemAccess.java
similarity index 76%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/TransportItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TransportItemAccess.java
index a72d231..020f029 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/TransportItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/TransportItemAccess.java
@@ -15,27 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
-public class TransportItem implements LogItem<RoutingContext> {
+public class TransportItemAccess implements AccessLogItem<RoutingContext> {
   private static final String EMPTY_STR = "-";
 
+  /**
+   * access log only support rest
+   */
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
-    builder.append(EMPTY_STR);
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+    builder.append("rest");
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     String transportName = finishEvent.getInvocation().getConfigTransportName();
     if (!StringUtils.isEmpty(transportName)) {
       builder.append(transportName);
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemAccess.java
similarity index 85%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemAccess.java
index bf6b45a..b9e6a23 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemAccess.java
@@ -15,27 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
-public class UrlPathItem implements LogItem<RoutingContext> {
+public class UrlPathItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || StringUtils.isEmpty(request.path())) {
       builder.append(EMPTY_RESULT);
@@ -45,7 +45,7 @@ public class UrlPathItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     OperationMeta operationMeta = finishEvent.getInvocation().getOperationMeta();
     SchemaMeta schemaMeta = finishEvent.getInvocation().getSchemaMeta();
     if (operationMeta != null && schemaMeta != null && schemaMeta.getSwagger() != null) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathWithQueryItem.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathWithQueryItemAccess.java
similarity index 81%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathWithQueryItem.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathWithQueryItemAccess.java
index 8465677..23a11f7 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathWithQueryItem.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathWithQueryItemAccess.java
@@ -15,25 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.apache.servicecomb.common.rest.RestConst.REST_CLIENT_REQUEST_PATH;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 import org.springframework.util.StringUtils;
 
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
-public class UrlPathWithQueryItem implements LogItem<RoutingContext> {
+public class UrlPathWithQueryItemAccess implements AccessLogItem<RoutingContext> {
 
   public static final String EMPTY_RESULT = "-";
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     HttpServerRequest request = accessLogEvent.getRoutingContext().request();
     if (null == request || StringUtils.isEmpty(request.uri())) {
       builder.append(EMPTY_RESULT);
@@ -43,7 +43,7 @@ public class UrlPathWithQueryItem implements LogItem<RoutingContext> {
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent finishEvent, StringBuilder builder) {
     Invocation invocation = finishEvent.getInvocation();
     if (null == invocation || null == invocation.getLocalContext(REST_CLIENT_REQUEST_PATH)
         || StringUtils.isEmpty(invocation.getLocalContext(REST_CLIENT_REQUEST_PATH).toString())) {
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogItemCreator.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogItemCreator.java
similarity index 61%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogItemCreator.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogItemCreator.java
index 7a6f279..238d206 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogItemCreator.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogItemCreator.java
@@ -15,21 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser;
+package org.apache.servicecomb.common.accessLog.core.parser;
 
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.CookieItem;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.element.impl.CookieItemAccess;
 
 /**
- * The {@linkplain LogItemCreator}s are able to instantiate a group of {@linkplain LogItem}.
+ * The {@linkplain AccessLogItemCreator}s are able to instantiate a group of {@linkplain AccessLogItem}.
  */
-public interface LogItemCreator<T> {
+public interface AccessLogItemCreator<T> {
   /**
-   * Create an instance of {@linkplain LogItem} which is specified by the config.
+   * Create an instance of {@linkplain AccessLogItem} which is specified by the config.
    * @param config
-   * e.g. For {@linkplain CookieItem CookieItem},
-   * the pattern may be "%{varName}C", and it's config is "varName". Some {@linkplain LogItem} with no configurable
+   * e.g. For {@linkplain CookieItemAccess CookieItem},
+   * the pattern may be "%{varName}C", and it's config is "varName". Some {@linkplain AccessLogItem} with no configurable
    * pattern (like "%m") will receive {@code null} as config.
    */
-  LogItem<T> createItem(String config);
+  AccessLogItem<T> createItem(String config);
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogItemMeta.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogItemMeta.java
similarity index 66%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogItemMeta.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogItemMeta.java
index c2d6adc..870bd1e 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogItemMeta.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogItemMeta.java
@@ -15,27 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser;
+package org.apache.servicecomb.common.accessLog.core.parser;
 
 
-public class LogItemMeta<T> {
+public class AccessLogItemMeta<T> {
   protected String prefix;
 
   protected String suffix;
 
   /**
-   * Used for sorting {@linkplain LogItemMeta}. Default value is 0.
+   * Used for sorting {@linkplain AccessLogItemMeta}. Default value is 0.
    * Smaller one has higher priority.
    */
   protected int order;
 
-  protected LogItemCreator<T> logItemCreator;
+  protected AccessLogItemCreator<T> accessLogItemCreator;
 
   public String getPrefix() {
     return prefix;
   }
 
-  public LogItemMeta<T> setPrefix(String prefix) {
+  public AccessLogItemMeta<T> setPrefix(String prefix) {
     this.prefix = prefix;
     return this;
   }
@@ -44,7 +44,7 @@ public class LogItemMeta<T> {
     return suffix;
   }
 
-  public LogItemMeta<T> setSuffix(String suffix) {
+  public AccessLogItemMeta<T> setSuffix(String suffix) {
     this.suffix = suffix;
     return this;
   }
@@ -53,17 +53,17 @@ public class LogItemMeta<T> {
     return order;
   }
 
-  public LogItemMeta<T> setOrder(int order) {
+  public AccessLogItemMeta<T> setOrder(int order) {
     this.order = order;
     return this;
   }
 
-  public LogItemCreator<T> getLogItemCreator() {
-    return logItemCreator;
+  public AccessLogItemCreator<T> getAccessLogItemCreator() {
+    return accessLogItemCreator;
   }
 
-  public LogItemMeta<T> setLogItemCreator(LogItemCreator<T> logItemCreator) {
-    this.logItemCreator = logItemCreator;
+  public AccessLogItemMeta<T> setAccessLogItemCreator(AccessLogItemCreator<T> accessLogItemCreator) {
+    this.accessLogItemCreator = accessLogItemCreator;
     return this;
   }
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogPatternParser.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogPatternParser.java
similarity index 68%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogPatternParser.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogPatternParser.java
index 3adb8b2..0dde409 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/LogPatternParser.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/AccessLogPatternParser.java
@@ -15,20 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser;
+package org.apache.servicecomb.common.accessLog.core.parser;
 
 import java.util.List;
 
-import org.apache.servicecomb.foundation.log.core.LogGenerator;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
+import org.apache.servicecomb.common.accessLog.core.AccessLogGenerator;
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+
 
 /**
- * This parser will parse the rawPattern of access log and generate a list of {@link LogItem},
- * which will be used in {@link LogGenerator} to generate
+ * This parser will parse the rawPattern of access log and generate a list of {@link AccessLogItem},
+ * which will be used in {@link AccessLogGenerator} to generate
  * access log content.
- * @param <T> the type of {@linkplain LogItem
+ * @param <T> the type of {@linkplain AccessLogItem
  * AccessLogParam.contextData}, which usually depends on the transport way.
  */
-public interface LogPatternParser<T> {
-  List<LogItem<T>> parsePattern(String rawPattern);
+public interface AccessLogPatternParser<T> {
+  List<AccessLogItem<T>> parsePattern(String rawPattern);
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/CompositeVertxRestLogItemMeta.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/CompositeVertxRestAccessLogItemMeta.java
similarity index 78%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/CompositeVertxRestLogItemMeta.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/CompositeVertxRestAccessLogItemMeta.java
index 3cb707d..f360847 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/CompositeVertxRestLogItemMeta.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/CompositeVertxRestAccessLogItemMeta.java
@@ -15,17 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser;
+package org.apache.servicecomb.common.accessLog.core.parser;
 
 import java.util.List;
 
 /**
- * Hold a group of {@link VertxRestLogItemMeta} so that user can define
+ * Hold a group of {@link VertxRestAccessLogItemMeta} so that user can define
  * only one VertxRestAccessLogItemMeta in spi loading file and load a group of meta.
  * 
  * Once the access log loading mechanism finds that a meta is CompositeVertxRestAccessLogItemMeta,
  * the meta hold by it will be used in access log while this meta itself will be ignored.
  */
-public abstract class CompositeVertxRestLogItemMeta extends VertxRestLogItemMeta {
-  public abstract List<VertxRestLogItemMeta> getAccessLogItemMetas();
+public abstract class CompositeVertxRestAccessLogItemMeta extends VertxRestAccessLogItemMeta {
+  public abstract List<VertxRestAccessLogItemMeta> getAccessLogItemMetas();
 }
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/VertxRestLogItemMeta.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/VertxRestAccessLogItemMeta.java
similarity index 57%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/VertxRestLogItemMeta.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/VertxRestAccessLogItemMeta.java
index 588abe3..b69b90a 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/VertxRestLogItemMeta.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/VertxRestAccessLogItemMeta.java
@@ -15,31 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser;
+package org.apache.servicecomb.common.accessLog.core.parser;
 
 import io.vertx.ext.web.RoutingContext;
 
 /**
  * For vertx-rest transport way.
  */
-public class VertxRestLogItemMeta extends LogItemMeta<RoutingContext> {
-  public VertxRestLogItemMeta() {
+public class VertxRestAccessLogItemMeta extends AccessLogItemMeta<RoutingContext> {
+  public VertxRestAccessLogItemMeta() {
   }
 
-  public VertxRestLogItemMeta(String prefix, String suffix,
-      LogItemCreator<RoutingContext> logItemCreator, int order) {
+  public VertxRestAccessLogItemMeta(String prefix, String suffix,
+      AccessLogItemCreator<RoutingContext> accessLogItemCreator, int order) {
     this.prefix = prefix;
     this.suffix = suffix;
-    this.logItemCreator = logItemCreator;
+    this.accessLogItemCreator = accessLogItemCreator;
     this.order = order;
   }
 
-  public VertxRestLogItemMeta(String prefix, LogItemCreator<RoutingContext> logItemCreator) {
-    this(prefix, null, logItemCreator, 0);
+  public VertxRestAccessLogItemMeta(String prefix, AccessLogItemCreator<RoutingContext> accessLogItemCreator) {
+    this(prefix, null, accessLogItemCreator, 0);
   }
 
-  public VertxRestLogItemMeta(String prefix, String suffix,
-      LogItemCreator<RoutingContext> logItemCreator) {
-    this(prefix, suffix, logItemCreator, 0);
+  public VertxRestAccessLogItemMeta(String prefix, String suffix,
+      AccessLogItemCreator<RoutingContext> accessLogItemCreator) {
+    this(prefix, suffix, accessLogItemCreator, 0);
   }
 }
diff --git a/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/DefaultCompositeVertxRestAccessLogItemMeta.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/DefaultCompositeVertxRestAccessLogItemMeta.java
new file mode 100644
index 0000000..8585639
--- /dev/null
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/DefaultCompositeVertxRestAccessLogItemMeta.java
@@ -0,0 +1,90 @@
+/*
+ * 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.common.accessLog.core.parser.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.element.impl.CookieItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DatetimeConfigurableItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DurationMillisecondItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DurationSecondItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.FirstLineOfRequestItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.HttpMethodItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.HttpStatusItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.InvocationContextItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.LocalHostItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.LocalPortItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.QueryStringItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RemoteHostItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RequestHeaderItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RequestProtocolItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.ResponseHeaderItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.ResponseSizeItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.TraceIdItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.TransportItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.UrlPathItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.UrlPathWithQueryItemAccess;
+import org.apache.servicecomb.common.accessLog.core.parser.CompositeVertxRestAccessLogItemMeta;
+import org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta;
+
+import io.vertx.ext.web.RoutingContext;
+
+public class DefaultCompositeVertxRestAccessLogItemMeta extends CompositeVertxRestAccessLogItemMeta {
+  private static final List<VertxRestAccessLogItemMeta> SUPPORTED_META = new ArrayList<>();
+
+  static {
+    final AccessLogItem<RoutingContext> httpMethodItem = new HttpMethodItemAccess();
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%m", config -> httpMethodItem));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("cs-method", config -> httpMethodItem));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%s", config -> new HttpStatusItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("sc-status", config -> new HttpStatusItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%T", config -> new DurationSecondItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%D", config -> new DurationMillisecondItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%h", config -> new RemoteHostItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%v", config -> new LocalHostItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%p", config -> new LocalPortItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%B", config -> new ResponseSizeItemAccess("0")));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%b", config -> new ResponseSizeItemAccess("-")));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%r", config -> new FirstLineOfRequestItemAccess()));
+    final AccessLogItem<RoutingContext> urlPathItem = new UrlPathItemAccess();
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%U", config -> urlPathItem));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("cs-uri-stem", config -> urlPathItem));
+    final AccessLogItem<RoutingContext> queryStringItem = new QueryStringItemAccess();
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%q", config -> queryStringItem));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("cs-uri-query", config -> queryStringItem));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("cs-uri", config -> new UrlPathWithQueryItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%H", config -> new RequestProtocolItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%t", config -> new DatetimeConfigurableItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%SCB-traceId", config -> new TraceIdItemAccess()));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%SCB-transport", config -> new TransportItemAccess()));
+
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%{", "}t", DatetimeConfigurableItemAccess::new));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%{", "}i", RequestHeaderItemAccess::new));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%{", "}o", ResponseHeaderItemAccess::new));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%{", "}C", CookieItemAccess::new));
+    SUPPORTED_META.add(new VertxRestAccessLogItemMeta("%{", "}SCB-ctx", InvocationContextItemAccess::new));
+  }
+
+  @Override
+  public List<VertxRestAccessLogItemMeta> getAccessLogItemMetas() {
+    return SUPPORTED_META;
+  }
+}
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/impl/VertxRestLogPatternParser.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java
similarity index 76%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/impl/VertxRestLogPatternParser.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java
index c077d76..02d97a9 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/impl/VertxRestLogPatternParser.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParser.java
@@ -15,20 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser.impl;
+package org.apache.servicecomb.common.accessLog.core.parser.impl;
 
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.element.impl.PlainTextItemAccess;
+import org.apache.servicecomb.common.accessLog.core.parser.AccessLogItemMeta;
+import org.apache.servicecomb.common.accessLog.core.parser.AccessLogPatternParser;
+import org.apache.servicecomb.common.accessLog.core.parser.CompositeVertxRestAccessLogItemMeta;
+import org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.PlainTextItem;
-import org.apache.servicecomb.foundation.log.core.parser.CompositeVertxRestLogItemMeta;
-import org.apache.servicecomb.foundation.log.core.parser.LogItemMeta;
-import org.apache.servicecomb.foundation.log.core.parser.LogPatternParser;
-import org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,10 +37,10 @@ import io.vertx.ext.web.RoutingContext;
 /**
  * The parser is used for rest-over-vertx transport.
  */
-public class VertxRestLogPatternParser implements LogPatternParser<RoutingContext> {
-  private static final Logger LOGGER = LoggerFactory.getLogger(VertxRestLogPatternParser.class);
+public class VertxRestAccessLogPatternParser implements AccessLogPatternParser<RoutingContext> {
+  private static final Logger LOGGER = LoggerFactory.getLogger(VertxRestAccessLogPatternParser.class);
 
-  public static final Comparator<VertxRestLogItemMeta> accessLogItemMetaComparator = (m1, m2) -> {
+  public static final Comparator<VertxRestAccessLogItemMeta> accessLogItemMetaComparator = (m1, m2) -> {
     int result = m1.getOrder() - m2.getOrder();
     if (result != 0) {
       return result;
@@ -60,17 +60,17 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
         : result;
   };
 
-  private List<VertxRestLogItemMeta> metaList = new ArrayList<>();
+  private List<VertxRestAccessLogItemMeta> metaList = new ArrayList<>();
 
-  public VertxRestLogPatternParser() {
-    List<VertxRestLogItemMeta> loadedMeta = loadVertxRestLogItemMeta();
+  public VertxRestAccessLogPatternParser() {
+    List<VertxRestAccessLogItemMeta> loadedMeta = loadVertxRestLogItemMeta();
     if (null == loadedMeta || loadedMeta.isEmpty()) {
       LOGGER.error("cannot load AccessLogItemMeta!");
       throw new IllegalStateException("cannot load AccessLogItemMeta!");
     }
-    for (VertxRestLogItemMeta meta : loadedMeta) {
-      if (CompositeVertxRestLogItemMeta.class.isAssignableFrom(meta.getClass())) {
-        this.metaList.addAll(((CompositeVertxRestLogItemMeta) meta).getAccessLogItemMetas());
+    for (VertxRestAccessLogItemMeta meta : loadedMeta) {
+      if (CompositeVertxRestAccessLogItemMeta.class.isAssignableFrom(meta.getClass())) {
+        this.metaList.addAll(((CompositeVertxRestAccessLogItemMeta) meta).getAccessLogItemMetas());
       } else {
         this.metaList.add(meta);
       }
@@ -78,8 +78,8 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
     sortAccessLogItemMeta(this.metaList);
   }
 
-  private List<VertxRestLogItemMeta> loadVertxRestLogItemMeta() {
-    return SPIServiceUtils.getOrLoadSortedService(VertxRestLogItemMeta.class);
+  private List<VertxRestAccessLogItemMeta> loadVertxRestLogItemMeta() {
+    return SPIServiceUtils.getOrLoadSortedService(VertxRestAccessLogItemMeta.class);
   }
 
   /**
@@ -104,17 +104,17 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
   }
 
   /**
-   * Sort all of the {@link LogItemMeta}, the meta that is in front of the others has higher priority.
-   * 
+   * Sort all of the {@link AccessLogItemMeta}, the meta that is in front of the others has higher priority.
+   *
    * Sort rule(priority decreased):
    * <ol>
-   *   <li>compare the {@link LogItemMeta#getOrder()}</li>
-   *   <li>compare the {@link LogItemMeta#getSuffix()} in lexicographic order, if one's suffix is start with
+   *   <li>compare the {@link AccessLogItemMeta#getOrder()}</li>
+   *   <li>compare the {@link AccessLogItemMeta#getSuffix()} in lexicographic order, if one's suffix is start with
    *   the other one's suffix, this one(who's suffix is longer) has higher priority</li>
-   *   <li>compare the {@link LogItemMeta#getPrefix()}, compare rule is the same as suffix.</li>
+   *   <li>compare the {@link AccessLogItemMeta#getPrefix()}, compare rule is the same as suffix.</li>
    * </ol>
    *
-   * e.g. given a list of {@link LogItemMeta} like below:
+   * e.g. given a list of {@link AccessLogItemMeta} like below:
    * <ol>
    * <li>(%ac{,}bcd)</li>
    * <li>(%ac{,}bc)</li>
@@ -137,16 +137,16 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
    * <li>(%b,)</li>
    * </ol>
    */
-  public static void sortAccessLogItemMeta(List<VertxRestLogItemMeta> accessLogItemMetaList) {
+  public static void sortAccessLogItemMeta(List<VertxRestAccessLogItemMeta> accessLogItemMetaList) {
     accessLogItemMetaList.sort(accessLogItemMetaComparator);
   }
 
   /**
    * @param rawPattern The access log pattern string specified by users.
-   * @return A list of {@linkplain LogItem} which actually generate the content of access log.
+   * @return A list of {@linkplain AccessLogItem} which actually generate the content of access log.
    */
   @Override
-  public List<LogItem<RoutingContext>> parsePattern(String rawPattern) {
+  public List<AccessLogItem<RoutingContext>> parsePattern(String rawPattern) {
     LOGGER.info("parse the pattern of access log: [{}]", rawPattern);
     List<AccessLogItemLocation> locationList = matchAccessLogItem(rawPattern);
     locationList = fillInPlainTextLocation(rawPattern, locationList);
@@ -164,7 +164,7 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
     int cursor = 0;
     while (cursor < rawPattern.length()) {
       AccessLogItemLocation candidate = null;
-      for (VertxRestLogItemMeta meta : metaList) {
+      for (VertxRestAccessLogItemMeta meta : metaList) {
         if (null != candidate && null == meta.getSuffix()) {
           // TODO:
           // if user define item("%{","}ab") and item("%{_","}abc") and the pattern is "%{_var}ab}abc"
@@ -209,12 +209,12 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
   }
 
   /**
-   * After processing of {@link #matchAccessLogItem(String)}, all of the placeholders of {@link LogItem} have been
+   * After processing of {@link #matchAccessLogItem(String)}, all of the placeholders of {@link AccessLogItem} have been
    * picked out. So the rest part of rawPattern should be treated as plain text. Those parts will be located in this
-   * method and wrapped as {@link PlainTextItem}.
+   * method and wrapped as {@link PlainTextItemAccess}.
    * @param rawPattern raw pattern string of access log
    * @param locationList locations picked out by {@link #matchAccessLogItem(String)}
-   * @return all of the locations including {@link PlainTextItem}.
+   * @return all of the locations including {@link PlainTextItemAccess}.
    */
   private List<AccessLogItemLocation> fillInPlainTextLocation(String rawPattern,
       List<AccessLogItemLocation> locationList) {
@@ -252,23 +252,22 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
     return new AccessLogItemLocation(front, rear);
   }
 
-  private List<LogItem<RoutingContext>> convertToItemList(String rawPattern,
+  private List<AccessLogItem<RoutingContext>> convertToItemList(String rawPattern,
       List<AccessLogItemLocation> locationList) {
-    List<LogItem<RoutingContext>> itemList = new ArrayList<>();
+    List<AccessLogItem<RoutingContext>> itemList = new ArrayList<>();
 
     for (AccessLogItemLocation accessLogItemLocation : locationList) {
-      VertxRestLogItemMeta accessLogItemMeta = accessLogItemLocation.accessLogItemMeta;
+      VertxRestAccessLogItemMeta accessLogItemMeta = accessLogItemLocation.accessLogItemMeta;
       if (null == accessLogItemMeta) {
         // a PlainTextItem location
-        itemList.add(new PlainTextItem(rawPattern.substring(
+        itemList.add(new PlainTextItemAccess(rawPattern.substring(
             accessLogItemLocation.prefixIndex, accessLogItemLocation.tail
         )));
         continue;
       }
 
-      itemList.add(
-          accessLogItemMeta.getLogItemCreator().createItem(
-              getConfigString(rawPattern, accessLogItemLocation))
+      itemList.add(accessLogItemMeta.getAccessLogItemCreator().createItem(
+          getConfigString(rawPattern, accessLogItemLocation))
       );
     }
 
@@ -302,10 +301,10 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
      */
     int tail;
 
-    VertxRestLogItemMeta accessLogItemMeta;
+    VertxRestAccessLogItemMeta accessLogItemMeta;
 
     /**
-     * for {@link PlainTextItem} only
+     * for {@link PlainTextItemAccess} only
      */
     AccessLogItemLocation(int prefixIndex, int suffixIndex) {
       this.prefixIndex = prefixIndex;
@@ -316,7 +315,7 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
     /**
      * for configurable type AccessLogItem
      */
-    AccessLogItemLocation(int prefixIndex, int suffixIndex, VertxRestLogItemMeta accessLogItemMeta) {
+    AccessLogItemLocation(int prefixIndex, int suffixIndex, VertxRestAccessLogItemMeta accessLogItemMeta) {
       this.prefixIndex = prefixIndex;
       this.suffixIndex = suffixIndex;
       this.tail = suffixIndex + accessLogItemMeta.getSuffix().length();
@@ -326,7 +325,7 @@ public class VertxRestLogPatternParser implements LogPatternParser<RoutingContex
     /**
      * for simple type AccessLogItem
      */
-    AccessLogItemLocation(int prefixIndex, VertxRestLogItemMeta accessLogItemMeta) {
+    AccessLogItemLocation(int prefixIndex, VertxRestAccessLogItemMeta accessLogItemMeta) {
       this.prefixIndex = prefixIndex;
       this.suffixIndex = prefixIndex + accessLogItemMeta.getPrefix().length();
       this.tail = this.suffixIndex;
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/placeholder/LogItemTypeEnum.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/placeholder/AccessLogItemTypeEnum.java
similarity index 93%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/placeholder/LogItemTypeEnum.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/placeholder/AccessLogItemTypeEnum.java
index a25762f..5352e37 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/placeholder/LogItemTypeEnum.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/core/placeholder/AccessLogItemTypeEnum.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.placeholder;
+package org.apache.servicecomb.common.accessLog.core.placeholder;
 
 /**
  * record what kinds of access log item we support
  */
-public enum LogItemTypeEnum {
+public enum AccessLogItemTypeEnum {
   TEXT_PLAIN,
   // %m, cs-method
   HTTP_METHOD,
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/server/ServerDefaultInitializer.java b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java
similarity index 66%
rename from foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/server/ServerDefaultInitializer.java
rename to common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java
index aec21bb..9b10ac4 100644
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/server/ServerDefaultInitializer.java
+++ b/common/common-access-log/src/main/java/org/apache/servicecomb/common/accessLog/server/ServerDefaultInitializer.java
@@ -15,12 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.server;
+package org.apache.servicecomb.common.accessLog.server;
 
+import org.apache.servicecomb.common.accessLog.AccessLogConfig;
+import org.apache.servicecomb.common.accessLog.AccessLogInitializer;
+import org.apache.servicecomb.common.accessLog.core.AccessLogGenerator;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.LogConfig;
-import org.apache.servicecomb.foundation.log.LogInitializer;
-import org.apache.servicecomb.foundation.log.core.LogGenerator;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,24 +29,24 @@ import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
 
-public class ServerDefaultInitializer implements LogInitializer {
+public class ServerDefaultInitializer implements AccessLogInitializer {
 
   private static Logger LOGGER = LoggerFactory.getLogger("accesslog");
 
-  private LogGenerator logGenerator;
+  private AccessLogGenerator accessLogGenerator;
 
   @Override
-  public void init(EventBus eventBus, LogConfig logConfig) {
-    if (!logConfig.isServerLogEnabled()) {
+  public void init(EventBus eventBus, AccessLogConfig accessLogConfig) {
+    if (!accessLogConfig.isServerLogEnabled()) {
       return;
     }
-    logGenerator = new LogGenerator(logConfig.getServerLogPattern());
+    accessLogGenerator = new AccessLogGenerator(accessLogConfig.getServerLogPattern());
     eventBus.register(this);
   }
 
   @Subscribe
   @AllowConcurrentEvents
   public void onRequestReceived(ServerAccessLogEvent accessLogEvent) {
-    LOGGER.info(logGenerator.generateServerLog(accessLogEvent));
+    LOGGER.info(accessLogGenerator.generateServerLog(accessLogEvent));
   }
 }
diff --git a/foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.log.LogInitializer b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.AccessLogInitializer
similarity index 84%
rename from foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.log.LogInitializer
rename to common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.AccessLogInitializer
index fd4421f..159849d 100644
--- a/foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.log.LogInitializer
+++ b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.AccessLogInitializer
@@ -15,5 +15,5 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.foundation.log.client.ClientDefaultInitializer
-org.apache.servicecomb.foundation.log.server.ServerDefaultInitializer
+org.apache.servicecomb.common.accessLog.client.ClientDefaultInitializer
+org.apache.servicecomb.common.accessLog.server.ServerDefaultInitializer
diff --git a/foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
similarity index 88%
rename from foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta
rename to common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
index 83453b4..78f937b 100644
--- a/foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta
+++ b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.foundation.log.core.parser.impl.DefaultCompositeVertxRestLogItemMeta
\ No newline at end of file
+org.apache.servicecomb.common.accessLog.core.parser.impl.DefaultCompositeVertxRestAccessLogItemMeta
\ No newline at end of file
diff --git a/foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
similarity index 92%
rename from foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
rename to common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
index cc656a8..7ab357e 100644
--- a/foundations/foundation-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
+++ b/common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.foundation.log.LogBootListener
\ No newline at end of file
+org.apache.servicecomb.common.accessLog.AccessLogBootListener
\ No newline at end of file
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/resources/config/base/log4j.properties b/common/common-access-log/src/main/resources/config/base/log4j.properties
similarity index 70%
rename from transports/transport-rest/transport-rest-vertx/src/main/resources/config/base/log4j.properties
rename to common/common-access-log/src/main/resources/config/base/log4j.properties
index d19fd97..01fed5b 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/resources/config/base/log4j.properties
+++ b/common/common-access-log/src/main/resources/config/base/log4j.properties
@@ -17,7 +17,20 @@
 
 # access log default configuration
 paas.logs.accesslog.dir=${paas.logs.dir}
+paas.logs.requestlog.dir=${paas.logs.dir}
+
 paas.logs.accesslog.file=access.log
+paas.logs.requestlog.file=request.log
+#request log File appender
+log4j.logger.requestlog=INFO,request
+log4j.appender.request=org.apache.servicecomb.foundation.common.utils.RollingFileAppenderExt
+log4j.appender.request.MaxBackupIndex=10
+log4j.appender.request.MaxFileSize=20MB
+log4j.appender.request.file=${paas.logs.requestlog.dir}${paas.logs.requestlog.file}
+log4j.appender.request.layout=org.apache.log4j.PatternLayout
+log4j.appender.request.layout.ConversionPattern=%m%n
+log4j.appender.request.logPermission=rw-------
+log4j.additivity.requestlog=false
 # access log File appender
 log4j.logger.accesslog=INFO,access
 log4j.appender.access=org.apache.servicecomb.foundation.common.utils.RollingFileAppenderExt
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/LogConfigTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogConfigTest.java
similarity index 72%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/LogConfigTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogConfigTest.java
index 431a800..245b939 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/LogConfigTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogConfigTest.java
@@ -15,28 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core;
+package org.apache.servicecomb.common.accessLog.core;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
-import org.apache.servicecomb.foundation.log.LogConfig;
+import org.apache.servicecomb.common.accessLog.AccessLogConfig;
 import org.junit.Test;
 
-public class LogConfigTest {
+public class AccessLogConfigTest {
 
   @Test
   public void getAccessLogEnabled() {
-    boolean serverEnabled = LogConfig.INSTANCE.isServerLogEnabled();
-    boolean clientEnabled = LogConfig.INSTANCE.isClientLogEnabled();
+    boolean serverEnabled = AccessLogConfig.INSTANCE.isServerLogEnabled();
+    boolean clientEnabled = AccessLogConfig.INSTANCE.isClientLogEnabled();
     assertFalse(serverEnabled);
     assertFalse(clientEnabled);
   }
 
   @Test
   public void getAccesslogPattern() {
-    String clientLogPattern = LogConfig.INSTANCE.getClientLogPattern();
-    String serverLogPattern = LogConfig.INSTANCE.getServerLogPattern();
+    String clientLogPattern = AccessLogConfig.INSTANCE.getClientLogPattern();
+    String serverLogPattern = AccessLogConfig.INSTANCE.getServerLogPattern();
 
     assertEquals("%h - - %t %r %s %B %D", serverLogPattern);
     assertEquals("%h %SCB-transport - - %t %r %s %D", clientLogPattern);
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/LogGeneratorTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java
similarity index 65%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/LogGeneratorTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java
index 5682f2b..52f62a2 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/LogGeneratorTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/AccessLogGeneratorTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core;
+package org.apache.servicecomb.common.accessLog.core;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -23,15 +23,18 @@ import static org.mockito.Mockito.when;
 import java.text.SimpleDateFormat;
 import java.util.TimeZone;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DatetimeConfigurableItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.HttpMethodItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.PlainTextItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RemoteHostItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.UserDefinedAccessAccessLogItem;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DatetimeConfigurableItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.HttpMethodItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.PlainTextItem;
+
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -41,17 +44,20 @@ import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 import mockit.Deencapsulation;
 
-public class LogGeneratorTest {
+public class AccessLogGeneratorTest {
+
+  private static final AccessLogGenerator LOG_GENERATOR = new AccessLogGenerator("%m - %t");
 
-  private static final LogGenerator LOG_GENERATOR = new LogGenerator("%m - %t");
+  private static final AccessLogGenerator USER_DEFINED_LOG_GENERATOR = new AccessLogGenerator(
+      "%h - - %{test-config}user-defined");
 
   @Test
   public void testConstructor() {
-    LogItem<RoutingContext>[] elements = Deencapsulation.getField(LOG_GENERATOR, "logItems");
+    AccessLogItem<RoutingContext>[] elements = Deencapsulation.getField(LOG_GENERATOR, "accessLogItems");
     assertEquals(3, elements.length);
-    assertEquals(HttpMethodItem.class, elements[0].getClass());
-    assertEquals(PlainTextItem.class, elements[1].getClass());
-    assertEquals(DatetimeConfigurableItem.class, elements[2].getClass());
+    assertEquals(HttpMethodItemAccess.class, elements[0].getClass());
+    assertEquals(PlainTextItemAccess.class, elements[1].getClass());
+    assertEquals(DatetimeConfigurableItemAccess.class, elements[2].getClass());
   }
 
   @Test
@@ -61,8 +67,8 @@ public class LogGeneratorTest {
     long startMillisecond = 1416863450581L;
     ServerAccessLogEvent serverAccessLogEvent = new ServerAccessLogEvent();
     serverAccessLogEvent.setMilliStartTime(startMillisecond).setRoutingContext(context);
-    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItem.DEFAULT_DATETIME_PATTERN,
-        DatetimeConfigurableItem.DEFAULT_LOCALE);
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItemAccess.DEFAULT_DATETIME_PATTERN,
+        DatetimeConfigurableItemAccess.DEFAULT_LOCALE);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
     when(context.request()).thenReturn(request);
@@ -86,11 +92,20 @@ public class LogGeneratorTest {
     when(invocation.getInvocationStageTrace()).thenReturn(stageTrace);
 
     InvocationFinishEvent finishEvent = new InvocationFinishEvent(invocation, null);
-    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItem.DEFAULT_DATETIME_PATTERN,
-        DatetimeConfigurableItem.DEFAULT_LOCALE);
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItemAccess.DEFAULT_DATETIME_PATTERN,
+        DatetimeConfigurableItemAccess.DEFAULT_LOCALE);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
     when(operationMeta.getHttpMethod()).thenReturn(HttpMethod.DELETE.toString());
     String log = LOG_GENERATOR.generateClientLog(finishEvent);
     Assert.assertEquals("DELETE" + " - " + simpleDateFormat.format(startMillisecond), log);
   }
+
+  @Test
+  public void testUserDefinedLogGenerator() {
+    AccessLogItem<RoutingContext>[] elements = Deencapsulation.getField(USER_DEFINED_LOG_GENERATOR, "accessLogItems");
+    assertEquals(3, elements.length);
+    assertEquals(RemoteHostItemAccess.class, elements[0].getClass());
+    assertEquals(PlainTextItemAccess.class, elements[1].getClass());
+    assertEquals(UserDefinedAccessAccessLogItem.class, elements[2].getClass());
+  }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/CookieItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java
similarity index 89%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/CookieItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java
index f31f711..9384116 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/CookieItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/CookieItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.mockito.Mockito.when;
 
@@ -42,7 +42,7 @@ public class CookieItemTest {
 
   public static final String COOKIE_VALUE = "cookieVALUE";
 
-  private static final CookieItem ELEMENT = new CookieItem(COOKIE_NAME);
+  private static final CookieItemAccess ELEMENT = new CookieItemAccess(COOKIE_NAME);
 
   private StringBuilder strBuilder;
 
@@ -77,7 +77,7 @@ public class CookieItemTest {
     when(mockContext.cookieMap()).thenReturn(cookieSet);
     accessLogEvent.setRoutingContext(mockContext);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals(COOKIE_VALUE, strBuilder.toString());
   }
 
@@ -93,7 +93,7 @@ public class CookieItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerMap);
     when(restClientRequest.getCookieMap()).thenReturn(cookieMap);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals(COOKIE_VALUE, strBuilder.toString());
   }
 
@@ -104,7 +104,7 @@ public class CookieItemTest {
     Mockito.when(mockContext.cookieMap()).thenReturn(cookieSet);
     accessLogEvent.setRoutingContext(mockContext);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -118,7 +118,7 @@ public class CookieItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerMap);
     when(restClientRequest.getCookieMap()).thenReturn(cookieMap);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -129,7 +129,7 @@ public class CookieItemTest {
     Mockito.when(mockContext.cookieMap()).thenReturn(null);
     accessLogEvent.setRoutingContext(mockContext);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -142,7 +142,7 @@ public class CookieItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerMap);
     when(restClientRequest.getCookieMap()).thenReturn(null);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -156,7 +156,7 @@ public class CookieItemTest {
     Mockito.when(mockContext.cookieMap()).thenReturn(cookieSet);
     accessLogEvent.setRoutingContext(mockContext);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -171,7 +171,7 @@ public class CookieItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerMap);
     when(restClientRequest.getCookieMap()).thenReturn(cookieMap);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DatetimeConfigurableItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java
similarity index 74%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DatetimeConfigurableItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java
index 22bbffc..d3b09fb 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DatetimeConfigurableItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DatetimeConfigurableItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -65,109 +65,109 @@ public class DatetimeConfigurableItemTest {
 
   @Test
   public void serverFormattedElement() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "EEE, yyyy MMM dd HH:mm:ss zzz|GMT-08|zh-CN");
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("星期一, 2014 十一月 24 13:10:50 GMT-08:00", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElement() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "EEE, yyyy MMM dd HH:mm:ss zzz|GMT-08|zh-CN");
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("星期一, 2014 十一月 24 13:10:50 GMT-08:00", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnNoPattern() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "|GMT+08|zh-CN");
 
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("星期二, 25 十一月 2014 05:10:50 GMT+08:00", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnNoPattern() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "|GMT+08|zh-CN");
 
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("星期二, 25 十一月 2014 05:10:50 GMT+08:00", strBuilder.toString());
   }
 
   @Test
   public void getFormattedElementOnNoTimezone() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "yyyy/MM/dd zzz||zh-CN");
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd zzz", Locale.forLanguageTag("zh-CN"));
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(simpleDateFormat.format(START_MILLISECOND), strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnNoTimezone() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "yyyy/MM/dd zzz||zh-CN");
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd zzz", Locale.forLanguageTag("zh-CN"));
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(simpleDateFormat.format(START_MILLISECOND), strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnNoLocale() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "EEE, dd MMM yyyy HH:mm:ss zzz|GMT+08|");
 
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("Tue, 25 Nov 2014 05:10:50 GMT+08:00", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnNoLocale() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "EEE, dd MMM yyyy HH:mm:ss zzz|GMT+08|");
 
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("Tue, 25 Nov 2014 05:10:50 GMT+08:00", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnNoConfig() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "||");
-    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItem.DEFAULT_DATETIME_PATTERN,
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItemAccess.DEFAULT_DATETIME_PATTERN,
         Locale.US);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(simpleDateFormat.format(START_MILLISECOND), strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnNoConfig() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem(
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess(
         "||");
-    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItem.DEFAULT_DATETIME_PATTERN,
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatetimeConfigurableItemAccess.DEFAULT_DATETIME_PATTERN,
         Locale.US);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(simpleDateFormat.format(START_MILLISECOND), strBuilder.toString());
   }
 
   @Test
   public void serverConstructorWithNoArg() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem();
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess();
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("EEE, dd MMM yyyy HH:mm:ss zzz", element.getPattern());
     assertEquals(Locale.US, element.getLocale());
     assertEquals(TimeZone.getDefault(), element.getTimezone());
@@ -176,11 +176,11 @@ public class DatetimeConfigurableItemTest {
 
   @Test
   public void clientConstructorWithNoArg() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem();
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess();
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("EEE, dd MMM yyyy HH:mm:ss zzz", element.getPattern());
     assertEquals(Locale.US, element.getLocale());
     assertEquals(TimeZone.getDefault(), element.getTimezone());
@@ -189,11 +189,11 @@ public class DatetimeConfigurableItemTest {
 
   @Test
   public void serverConstructorWithNoSeparator() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem("yyyy/MM/dd HH:mm:ss zzz");
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess("yyyy/MM/dd HH:mm:ss zzz");
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss zzz", Locale.US);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("yyyy/MM/dd HH:mm:ss zzz", element.getPattern());
     assertEquals(Locale.US, element.getLocale());
     assertEquals(TimeZone.getDefault(), element.getTimezone());
@@ -202,11 +202,11 @@ public class DatetimeConfigurableItemTest {
 
   @Test
   public void clientConstructorWithNoSeparator() {
-    DatetimeConfigurableItem element = new DatetimeConfigurableItem("yyyy/MM/dd HH:mm:ss zzz");
+    DatetimeConfigurableItemAccess element = new DatetimeConfigurableItemAccess("yyyy/MM/dd HH:mm:ss zzz");
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss zzz", Locale.US);
     simpleDateFormat.setTimeZone(TimeZone.getDefault());
 
-    element.appendFormattedItem(finishEvent, strBuilder);
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("yyyy/MM/dd HH:mm:ss zzz", element.getPattern());
     assertEquals(Locale.US, element.getLocale());
     assertEquals(TimeZone.getDefault(), element.getTimezone());
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationMillisecondItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java
similarity index 88%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationMillisecondItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java
index 231aae8..5824bd0 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationMillisecondItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationMillisecondItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -30,7 +30,7 @@ import org.mockito.Mockito;
 
 public class DurationMillisecondItemTest {
 
-  public static final DurationMillisecondItem ELEMENT = new DurationMillisecondItem();
+  public static final DurationMillisecondItemAccess ELEMENT = new DurationMillisecondItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -61,11 +61,11 @@ public class DurationMillisecondItemTest {
 
   @Test
   public void testAppendFormattedElement() {
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("1", strBuilder.toString());
 
     strBuilder = new StringBuilder();
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("1", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationSecondItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java
similarity index 84%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationSecondItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java
index 2e983eb..5e9c59b 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/DurationSecondItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/DurationSecondItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -30,7 +30,7 @@ import org.mockito.Mockito;
 
 public class DurationSecondItemTest {
 
-  public static final DurationSecondItem ELEMENT = new DurationSecondItem();
+  public static final DurationSecondItemAccess ELEMENT = new DurationSecondItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -60,42 +60,42 @@ public class DurationSecondItemTest {
   @Test
   public void serverFormattedElementOn999ms() {
     accessLogEvent.setMilliEndTime(1000L);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("0", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOn999ms() {
     when(invocationStageTrace.getFinish()).thenReturn(1000_000_000L);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("0", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOn1000ms() {
     accessLogEvent.setMilliEndTime(1001L);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("1", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOn1000ms() {
     when(invocationStageTrace.getFinish()).thenReturn(1001_000_000L);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("1", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOn1001ms() {
     accessLogEvent.setMilliEndTime(1002L);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("1", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOn1001ms() {
     when(invocationStageTrace.getFinish()).thenReturn(1002_000_000L);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("1", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/FirstLineOfRequestItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java
similarity index 89%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/FirstLineOfRequestItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java
index bf971ac..5c7b599 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/FirstLineOfRequestItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/FirstLineOfRequestItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -42,7 +42,7 @@ import io.vertx.ext.web.RoutingContext;
 
 public class FirstLineOfRequestItemTest {
 
-  public static final FirstLineOfRequestItem ELEMENT = new FirstLineOfRequestItem();
+  public static final FirstLineOfRequestItemAccess ELEMENT = new FirstLineOfRequestItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -93,18 +93,18 @@ public class FirstLineOfRequestItemTest {
     when(request.path()).thenReturn(uri);
     when(request.version()).thenReturn(HttpVersion.HTTP_1_1);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("\"DELETE " + uri + " HTTP/1.1\"", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElement() {
     String uri = "/test/uri";
-    when(urlEndpoint.isSslEnabled()).thenReturn(false);
     when(clientRequest.method()).thenReturn(HttpMethod.DELETE);
     when(clientRequest.path()).thenReturn(uri);
+    when(urlEndpoint.isHttp2Enabled()).thenReturn(true);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
-    assertEquals("\"DELETE " + uri + " HTTP\"", strBuilder.toString());
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    assertEquals("\"DELETE " + uri + " HTTP/2.0\"", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpMethodItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java
similarity index 89%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpMethodItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java
index 012a965..dc2c828 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpMethodItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpMethodItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.mockito.Mockito.when;
 
@@ -40,7 +40,7 @@ import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
 public class HttpMethodItemTest {
-  private static final HttpMethodItem ITEM = new HttpMethodItem();
+  private static final HttpMethodItemAccess ITEM = new HttpMethodItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -86,7 +86,7 @@ public class HttpMethodItemTest {
     Mockito.when(routingContext.request()).thenReturn(request);
     Mockito.when(request.method()).thenReturn(HttpMethod.DELETE);
     accessLogEvent.setRoutingContext(routingContext);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("DELETE", strBuilder.toString());
   }
 
@@ -94,7 +94,7 @@ public class HttpMethodItemTest {
   public void clientFormattedElement() {
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.method()).thenReturn(HttpMethod.DELETE);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("DELETE", strBuilder.toString());
   }
 
@@ -102,14 +102,14 @@ public class HttpMethodItemTest {
   public void serverFormattedElementOnRequestIsNull() {
     accessLogEvent.setRoutingContext(routingContext);
     Mockito.when(routingContext.request()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnRequestIsNull() {
     when(restClientRequest.getRequest()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -121,14 +121,14 @@ public class HttpMethodItemTest {
 
     Mockito.when(routingContext.request()).thenReturn(request);
     Mockito.when(request.method()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnMethodIsNull() {
     when(clientRequest.method()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpStatusItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusItemTest.java
similarity index 85%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpStatusItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusItemTest.java
index 6a43b88..a5d226f 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/HttpStatusItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/HttpStatusItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -32,7 +32,7 @@ import io.vertx.ext.web.RoutingContext;
 
 public class HttpStatusItemTest {
 
-  private static final HttpStatusItem STATUS_ELEMENT = new HttpStatusItem();
+  private static final HttpStatusItemAccess STATUS_ELEMENT = new HttpStatusItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -64,7 +64,7 @@ public class HttpStatusItemTest {
     when(routingContext.response()).thenReturn(serverResponse);
     when(serverResponse.getStatusCode()).thenReturn(statusCode);
 
-    STATUS_ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    STATUS_ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("200", strBuilder.toString());
   }
 
@@ -74,14 +74,14 @@ public class HttpStatusItemTest {
     when(finishEvent.getResponse()).thenReturn(response);
     when(response.getStatusCode()).thenReturn(statusCode);
 
-    STATUS_ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    STATUS_ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("200", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnResponseIsNull() {
     Mockito.when(routingContext.response()).thenReturn(null);
-    STATUS_ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    STATUS_ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
 
     Mockito.when(routingContext.response()).thenReturn(serverResponse);
@@ -89,14 +89,14 @@ public class HttpStatusItemTest {
     Mockito.when(serverResponse.ended()).thenReturn(false);
 
     strBuilder = new StringBuilder();
-    STATUS_ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    STATUS_ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnResponseIsNull() {
     when(finishEvent.getResponse()).thenReturn(null);
-    STATUS_ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    STATUS_ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/InvocationContextItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/InvocationContextItemTest.java
similarity index 83%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/InvocationContextItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/InvocationContextItemTest.java
index 48952d4..54eea30 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/InvocationContextItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/InvocationContextItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.mockito.Mockito.when;
 
@@ -40,7 +40,7 @@ public class InvocationContextItemTest {
 
   public static final String INVOCATION_CONTEXT_VALUE = "testValue";
 
-  private static InvocationContextItem ITEM = new InvocationContextItem(INVOCATION_CONTEXT_KEY);
+  private static InvocationContextItemAccess ITEM = new InvocationContextItemAccess(INVOCATION_CONTEXT_KEY);
 
   private StringBuilder strBuilder;
 
@@ -70,7 +70,7 @@ public class InvocationContextItemTest {
     routingContextData.put(RestConst.REST_INVOCATION_CONTEXT, invocation);
     when(invocation.getContext(INVOCATION_CONTEXT_KEY)).thenReturn(INVOCATION_CONTEXT_VALUE);
 
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), Matchers.is(INVOCATION_CONTEXT_VALUE));
   }
 
@@ -81,7 +81,7 @@ public class InvocationContextItemTest {
     when(invocation.getContext()).thenReturn(context);
     context.put(INVOCATION_CONTEXT_KEY, INVOCATION_CONTEXT_VALUE);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), Matchers.is(INVOCATION_CONTEXT_VALUE));
   }
 
@@ -93,8 +93,8 @@ public class InvocationContextItemTest {
     routingContextData.put(RestConst.REST_INVOCATION_CONTEXT, invocation);
     when(invocation.getContext(INVOCATION_CONTEXT_KEY)).thenReturn(null);
 
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 
   @Test
@@ -104,8 +104,8 @@ public class InvocationContextItemTest {
     when(invocation.getContext()).thenReturn(context);
     context.put(INVOCATION_CONTEXT_KEY, null);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 
   @Test
@@ -113,8 +113,8 @@ public class InvocationContextItemTest {
     Map<String, Object> routingContextData = new HashMap<>();
     when(routingContext.data()).thenReturn(routingContextData);
 
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 
   @Test
@@ -123,29 +123,29 @@ public class InvocationContextItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getContext()).thenReturn(context);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 
   @Test
   public void testGetFormattedItemOnRoutingContextDataNotFound() {
     when(routingContext.data()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 
   @Test
   public void clientGetFormattedItemOnRoutingContextDataNotFound() {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getContext()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 
   @Test
   public void clientGetFormattedItemOnInvocationNotFound() {
     when(finishEvent.getInvocation()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItem.NOT_FOUND));
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertThat(strBuilder.toString(), Matchers.is(InvocationContextItemAccess.NOT_FOUND));
   }
 }
\ No newline at end of file
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java
new file mode 100644
index 0000000..a4005f1
--- /dev/null
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalHostItemTest.java
@@ -0,0 +1,185 @@
+/*
+ * 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.common.accessLog.core.element.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.common.rest.RestConst;
+import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
+import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.core.event.InvocationFinishEvent;
+import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.vertx.core.http.HttpClientRequest;
+import io.vertx.core.http.HttpConnection;
+import io.vertx.core.http.HttpServerRequest;
+import io.vertx.core.net.SocketAddress;
+import io.vertx.ext.web.RoutingContext;
+
+public class LocalHostItemTest {
+  public static final LocalHostItemAccess ELEMENT = new LocalHostItemAccess();
+
+  private StringBuilder strBuilder;
+
+  private InvocationFinishEvent finishEvent;
+
+  private ServerAccessLogEvent accessLogEvent;
+
+  private RoutingContext routingContext;
+
+  private HttpServerRequest serverRequest;
+
+  private SocketAddress socketAddress;
+
+  private Invocation invocation;
+
+  private RestClientRequestImpl restClientRequest;
+
+  private HttpClientRequest clientRequest;
+
+  private HttpConnection connection;
+
+  @Before
+  public void initStrBuilder() {
+    accessLogEvent = new ServerAccessLogEvent();
+    routingContext = Mockito.mock(RoutingContext.class);
+    finishEvent = Mockito.mock(InvocationFinishEvent.class);
+    serverRequest = Mockito.mock(HttpServerRequest.class);
+    socketAddress = Mockito.mock(SocketAddress.class);
+    invocation = Mockito.mock(Invocation.class);
+    restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+    clientRequest = Mockito.mock(HttpClientRequest.class);
+    connection = Mockito.mock(HttpConnection.class);
+    Map<String, Object> handlerMap = new HashMap<>();
+    handlerMap.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
+    when(finishEvent.getInvocation()).thenReturn(invocation);
+    when(invocation.getHandlerContext()).thenReturn(handlerMap);
+    accessLogEvent.setRoutingContext(routingContext);
+    strBuilder = new StringBuilder();
+  }
+
+  @Test
+  public void clientFormattedItem() {
+    String localAddress = "192.168.0.1";
+    when(restClientRequest.getRequest()).thenReturn(clientRequest);
+    when(clientRequest.connection()).thenReturn(connection);
+    when(connection.localAddress()).thenReturn(socketAddress);
+    when(socketAddress.host()).thenReturn(localAddress);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertEquals(localAddress, strBuilder.toString());
+  }
+
+  @Test
+  public void serverFormattedItem() {
+    String localAddress = "192.168.0.1";
+    accessLogEvent.setLocalAddress(localAddress);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
+    Assert.assertEquals(localAddress, strBuilder.toString());
+  }
+
+  @Test
+  public void getLocalAddress() {
+    String localHost = "testHost";
+    Mockito.when(routingContext.request()).thenReturn(serverRequest);
+    Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
+    Mockito.when(socketAddress.host()).thenReturn(localHost);
+
+    String result = LocalHostItemAccess.getLocalAddress(routingContext);
+    assertEquals(localHost, result);
+  }
+
+  @Test
+  public void serverLocalAddressOnRequestIsNull() {
+    Mockito.when(routingContext.request()).thenReturn(null);
+    String result = LocalHostItemAccess.getLocalAddress(routingContext);
+    assertEquals("-", result);
+  }
+
+  @Test
+  public void clientLocalAddressOnRequestIsNull() {
+    when(restClientRequest.getRequest()).thenReturn(null);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertEquals("-", strBuilder.toString());
+  }
+
+  @Test
+  public void serverLocalAddressOnLocalAddressIsNull() {
+    Mockito.when(routingContext.request()).thenReturn(serverRequest);
+    Mockito.when(serverRequest.localAddress()).thenReturn(null);
+    String result = LocalHostItemAccess.getLocalAddress(routingContext);
+    assertEquals("-", result);
+  }
+
+  @Test
+  public void clientLocalAddressOnLocalAddressIsNull() {
+    when(restClientRequest.getRequest()).thenReturn(clientRequest);
+    when(clientRequest.connection()).thenReturn(connection);
+    when(connection.localAddress()).thenReturn(null);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertEquals("-", strBuilder.toString());
+  }
+
+  @Test
+  public void serverLocalAddressOnHostIsNull() {
+    Mockito.when(routingContext.request()).thenReturn(serverRequest);
+    Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
+    Mockito.when(socketAddress.host()).thenReturn(null);
+
+    String result = LocalHostItemAccess.getLocalAddress(routingContext);
+    assertEquals("-", result);
+  }
+
+  @Test
+  public void clientLocalAddressOnHostIsNull() {
+    when(restClientRequest.getRequest()).thenReturn(clientRequest);
+    when(clientRequest.connection()).thenReturn(connection);
+    when(connection.localAddress()).thenReturn(socketAddress);
+    when(socketAddress.host()).thenReturn(null);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertEquals("-", strBuilder.toString());
+  }
+
+  @Test
+  public void serverLocalAddressIsEmpty() {
+    String localHost = "";
+    Mockito.when(routingContext.request()).thenReturn(serverRequest);
+    Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
+    Mockito.when(socketAddress.host()).thenReturn(localHost);
+
+    String result = LocalHostItemAccess.getLocalAddress(routingContext);
+    assertEquals("-", result);
+  }
+
+  @Test
+  public void clientLocalAddressIsEmpty() {
+    when(restClientRequest.getRequest()).thenReturn(clientRequest);
+    when(clientRequest.connection()).thenReturn(connection);
+    when(connection.localAddress()).thenReturn(socketAddress);
+    when(socketAddress.host()).thenReturn("");
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    Assert.assertEquals("-", strBuilder.toString());
+  }
+}
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalPortItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java
similarity index 52%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalPortItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java
index e27359b..b01bc90 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalPortItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/LocalPortItemTest.java
@@ -15,22 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.servicecomb.common.rest.RestConst;
+import org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl;
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import io.vertx.core.http.HttpClientRequest;
+import io.vertx.core.http.HttpConnection;
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.core.net.SocketAddress;
 import io.vertx.ext.web.RoutingContext;
 
 public class LocalPortItemTest {
-  public static final LocalPortItem ELEMENT = new LocalPortItem();
+  public static final LocalPortItemAccess ELEMENT = new LocalPortItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -44,6 +53,14 @@ public class LocalPortItemTest {
 
   private SocketAddress socketAddress;
 
+  private Invocation invocation;
+
+  private RestClientRequestImpl restClientRequest;
+
+  private HttpClientRequest clientRequest;
+
+  private HttpConnection connection;
+
   @Before
   public void initStrBuilder() {
     accessLogEvent = new ServerAccessLogEvent();
@@ -51,7 +68,14 @@ public class LocalPortItemTest {
     finishEvent = Mockito.mock(InvocationFinishEvent.class);
     serverRequest = Mockito.mock(HttpServerRequest.class);
     socketAddress = Mockito.mock(SocketAddress.class);
-
+    invocation = Mockito.mock(Invocation.class);
+    restClientRequest = Mockito.mock(RestClientRequestImpl.class);
+    clientRequest = Mockito.mock(HttpClientRequest.class);
+    connection = Mockito.mock(HttpConnection.class);
+    Map<String, Object> handlerMap = new HashMap<>();
+    handlerMap.put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
+    when(finishEvent.getInvocation()).thenReturn(invocation);
+    when(invocation.getHandlerContext()).thenReturn(handlerMap);
     accessLogEvent.setRoutingContext(routingContext);
     strBuilder = new StringBuilder();
   }
@@ -62,29 +86,48 @@ public class LocalPortItemTest {
     Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
     Mockito.when(socketAddress.port()).thenReturn(8080);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("8080", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElement() {
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
-    assertEquals("-", strBuilder.toString());
+    when(restClientRequest.getRequest()).thenReturn(clientRequest);
+    when(clientRequest.connection()).thenReturn(connection);
+    when(connection.localAddress()).thenReturn(socketAddress);
+    when(socketAddress.port()).thenReturn(8080);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    assertEquals("8080", strBuilder.toString());
   }
 
   @Test
-  public void getFormattedElementOnRequestIsNull() {
+  public void serverFormattedElementOnRequestIsNull() {
     Mockito.when(routingContext.request()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
   @Test
-  public void getFormattedElementOnLocalAddressIsNull() {
+  public void clientFormattedElementOnRequestIsNull() {
+    when(restClientRequest.getRequest()).thenReturn(null);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
+    assertEquals("-", strBuilder.toString());
+  }
+
+  @Test
+  public void serverFormattedElementOnLocalAddressIsNull() {
     Mockito.when(routingContext.request()).thenReturn(serverRequest);
     Mockito.when(serverRequest.localAddress()).thenReturn(null);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
+    assertEquals("-", strBuilder.toString());
+  }
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+  @Test
+  public void clientFormattedElementOnLocalAddressIsNull() {
+    when(restClientRequest.getRequest()).thenReturn(clientRequest);
+    when(clientRequest.connection()).thenReturn(connection);
+    when(connection.localAddress()).thenReturn(null);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/PlainTextItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/PlainTextItemTest.java
similarity index 82%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/PlainTextItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/PlainTextItemTest.java
index 2fcb201..53b6e4d 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/PlainTextItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/PlainTextItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 
@@ -41,15 +41,15 @@ public class PlainTextItemTest {
 
   @Test
   public void serverFormattedElement() {
-    PlainTextItem element = new PlainTextItem("contentTest");
-    element.appendFormattedItem(accessLogEvent, strBuilder);
+    PlainTextItemAccess element = new PlainTextItemAccess("contentTest");
+    element.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("contentTest", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElement() {
-    PlainTextItem element = new PlainTextItem("contentTest");
-    element.appendFormattedItem(finishEvent, strBuilder);
+    PlainTextItemAccess element = new PlainTextItemAccess("contentTest");
+    element.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("contentTest", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/QueryStringItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java
similarity index 89%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/QueryStringItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java
index 5aa8f1f..c1afa5c 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/QueryStringItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/QueryStringItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -37,7 +37,7 @@ import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
 public class QueryStringItemTest {
-  private static final QueryStringItem ITEM = new QueryStringItem();
+  private static final QueryStringItemAccess ITEM = new QueryStringItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -74,7 +74,7 @@ public class QueryStringItemTest {
     String query = "?status=up";
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.query()).thenReturn(query);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(query, strBuilder.toString());
   }
 
@@ -88,14 +88,14 @@ public class QueryStringItemTest {
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.query()).thenReturn(query);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(query, strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnRequestIsNull() {
     when(routingContext.request()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -107,7 +107,7 @@ public class QueryStringItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerContext);
     when(restClientRequest.getRequest()).thenReturn(null);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -115,7 +115,7 @@ public class QueryStringItemTest {
   public void serverFormattedElementOnQueryIsNull() {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.query()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -128,7 +128,7 @@ public class QueryStringItemTest {
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.query()).thenReturn(null);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -137,7 +137,7 @@ public class QueryStringItemTest {
     String query = "";
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.query()).thenReturn(query);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -151,7 +151,7 @@ public class QueryStringItemTest {
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.query()).thenReturn(query);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RemoteHostItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RemoteHostItemTest.java
similarity index 86%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RemoteHostItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RemoteHostItemTest.java
index 24967d9..3c2ee79 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RemoteHostItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RemoteHostItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
@@ -34,7 +34,7 @@ import io.vertx.core.net.SocketAddress;
 import io.vertx.ext.web.RoutingContext;
 
 public class RemoteHostItemTest {
-  public static final RemoteHostItem ELEMENT = new RemoteHostItem();
+  public static final RemoteHostItemAccess ELEMENT = new RemoteHostItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -75,7 +75,7 @@ public class RemoteHostItemTest {
     when(serverRequest.remoteAddress()).thenReturn(socketAddress);
     when(socketAddress.host()).thenReturn(remoteHost);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(remoteHost, strBuilder.toString());
   }
 
@@ -86,14 +86,14 @@ public class RemoteHostItemTest {
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(uriEndpointObject);
     when(uriEndpointObject.getHostOrIp()).thenReturn(remoteHost);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(remoteHost, strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnRequestIsNull() {
     when(routingContext.request()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -101,7 +101,7 @@ public class RemoteHostItemTest {
   public void clientFormattedElementOnRequestIsNull() {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(null);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -109,7 +109,7 @@ public class RemoteHostItemTest {
   public void serverFormattedElementOnRemoteAddressIsNull() {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.remoteAddress()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -118,7 +118,7 @@ public class RemoteHostItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(null);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -127,7 +127,7 @@ public class RemoteHostItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.remoteAddress()).thenReturn(socketAddress);
     when(socketAddress.host()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -137,7 +137,7 @@ public class RemoteHostItemTest {
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(uriEndpointObject);
     when(uriEndpointObject.getHostOrIp()).thenReturn(null);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -146,7 +146,7 @@ public class RemoteHostItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.remoteAddress()).thenReturn(socketAddress);
     when(socketAddress.host()).thenReturn("");
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -156,7 +156,7 @@ public class RemoteHostItemTest {
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(uriEndpointObject);
     when(uriEndpointObject.getHostOrIp()).thenReturn("");
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestHeaderItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java
similarity index 90%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestHeaderItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java
index 3d84b9b..b82ed08 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestHeaderItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestHeaderItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -41,7 +41,7 @@ import io.vertx.ext.web.RoutingContext;
 public class RequestHeaderItemTest {
   private static final String VAR_NAME = "varName";
 
-  private static final RequestHeaderItem ELEMENT = new RequestHeaderItem(VAR_NAME);
+  private static final RequestHeaderItemAccess ELEMENT = new RequestHeaderItemAccess(VAR_NAME);
 
   private StringBuilder strBuilder;
 
@@ -84,7 +84,7 @@ public class RequestHeaderItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.headers()).thenReturn(headers);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(testValue, strBuilder.toString());
     assertEquals(ELEMENT.getVarName(), VAR_NAME);
   }
@@ -101,7 +101,7 @@ public class RequestHeaderItemTest {
     when(clientRequest.headers()).thenReturn(headers);
     when(headers.get(VAR_NAME)).thenReturn(testValue);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(testValue, strBuilder.toString());
   }
 
@@ -110,7 +110,7 @@ public class RequestHeaderItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.headers()).thenReturn(null);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -123,7 +123,7 @@ public class RequestHeaderItemTest {
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.headers()).thenReturn(null);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -135,7 +135,7 @@ public class RequestHeaderItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.headers()).thenReturn(headers);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestProtocolItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestProtocolItemTest.java
similarity index 81%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestProtocolItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestProtocolItemTest.java
index d85151b..8083c78 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/RequestProtocolItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/RequestProtocolItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -34,7 +34,7 @@ import io.vertx.core.http.HttpVersion;
 import io.vertx.ext.web.RoutingContext;
 
 public class RequestProtocolItemTest {
-  private static final RequestProtocolItem ITEM = new RequestProtocolItem();
+  private static final RequestProtocolItemAccess ITEM = new RequestProtocolItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -71,17 +71,17 @@ public class RequestProtocolItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.version()).thenReturn(HttpVersion.HTTP_1_1);
 
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("HTTP/1.1", strBuilder.toString());
 
     strBuilder = new StringBuilder();
     when(serverRequest.version()).thenReturn(HttpVersion.HTTP_1_0);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("HTTP/1.0", strBuilder.toString());
 
     strBuilder = new StringBuilder();
     when(serverRequest.version()).thenReturn(HttpVersion.HTTP_2);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("HTTP/2.0", strBuilder.toString());
   }
 
@@ -90,17 +90,17 @@ public class RequestProtocolItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(urlEndpoint);
-    when(urlEndpoint.isSslEnabled()).thenReturn(true);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    assertEquals("HTTPS", strBuilder.toString());
+    when(urlEndpoint.isHttp2Enabled()).thenReturn(true);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    assertEquals("HTTP/2.0", strBuilder.toString());
 
     strBuilder = new StringBuilder();
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(urlEndpoint);
-    when(urlEndpoint.isSslEnabled()).thenReturn(false);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    assertEquals("HTTP", strBuilder.toString());
+    when(urlEndpoint.isHttp2Enabled()).thenReturn(false);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    assertEquals("HTTP/1.1", strBuilder.toString());
   }
 
   @Test
@@ -108,7 +108,7 @@ public class RequestProtocolItemTest {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.version()).thenReturn(null);
 
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -118,7 +118,7 @@ public class RequestProtocolItemTest {
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getAddress()).thenReturn(null);
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
-    assertEquals("-", strBuilder.toString());
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
+    assertEquals("HTTP/1.1", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseHeaderItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java
similarity index 87%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseHeaderItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java
index dad7e31..f95086e 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseHeaderItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseHeaderItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -41,7 +41,7 @@ public class ResponseHeaderItemTest {
 
   private static final String VAR_NAME = "varName";
 
-  private static final ResponseHeaderItem ELEMENT = new ResponseHeaderItem(VAR_NAME);
+  private static final ResponseHeaderItemAccess ELEMENT = new ResponseHeaderItemAccess(VAR_NAME);
 
   private StringBuilder strBuilder;
 
@@ -75,7 +75,7 @@ public class ResponseHeaderItemTest {
     when(routingContext.response()).thenReturn(serverResponse);
     when(serverResponse.headers()).thenReturn(headers);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(headerValue, strBuilder.toString());
     assertEquals(ELEMENT.getVarName(), VAR_NAME);
   }
@@ -91,7 +91,7 @@ public class ResponseHeaderItemTest {
     when(finishEvent.getResponse()).thenReturn(response);
     when(response.getHeaders()).thenReturn(headers);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(headerValue, strBuilder.toString());
     assertEquals(ELEMENT.getVarName(), VAR_NAME);
   }
@@ -101,7 +101,7 @@ public class ResponseHeaderItemTest {
     when(routingContext.response()).thenReturn(serverResponse);
     when(serverResponse.headers()).thenReturn(null);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -110,21 +110,21 @@ public class ResponseHeaderItemTest {
     when(finishEvent.getResponse()).thenReturn(response);
     when(response.getHeaders()).thenReturn(null);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnResponseIsNull() {
     when(routingContext.response()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnResponseIsNull() {
     when(finishEvent.getResponse()).thenReturn(null);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -136,7 +136,7 @@ public class ResponseHeaderItemTest {
     when(routingContext.response()).thenReturn(serverResponse);
     when(serverResponse.headers()).thenReturn(headers);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -150,7 +150,7 @@ public class ResponseHeaderItemTest {
     when(finishEvent.getResponse()).thenReturn(response);
     when(response.getHeaders()).thenReturn(headers);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseSizeItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseSizeItemTest.java
similarity index 86%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseSizeItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseSizeItemTest.java
index 0db4f27..b627b39 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/ResponseSizeItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/ResponseSizeItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -30,7 +30,7 @@ import io.vertx.core.http.HttpServerResponse;
 import io.vertx.ext.web.RoutingContext;
 
 public class ResponseSizeItemTest {
-  private static final ResponseSizeItem ELEMENT = new ResponseSizeItem("0");
+  private static final ResponseSizeItemAccess ELEMENT = new ResponseSizeItemAccess("0");
 
   private StringBuilder strBuilder;
 
@@ -59,20 +59,20 @@ public class ResponseSizeItemTest {
     when(routingContext.response()).thenReturn(serverResponse);
     when(serverResponse.bytesWritten()).thenReturn(bytesWritten);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(String.valueOf(bytesWritten), strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElement() {
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("0", strBuilder.toString());
   }
 
   @Test
   public void getFormattedElementOnResponseIsNull() {
     when(routingContext.response()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("0", strBuilder.toString());
   }
 
@@ -81,7 +81,7 @@ public class ResponseSizeItemTest {
     long bytesWritten = 0L;
     when(routingContext.response()).thenReturn(serverResponse);
     when(serverResponse.bytesWritten()).thenReturn(bytesWritten);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("0", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/TraceIdItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java
similarity index 87%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/TraceIdItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java
index 779561d..e6578cf 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/TraceIdItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TraceIdItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.hamcrest.core.Is.is;
 import static org.mockito.Mockito.when;
@@ -37,7 +37,7 @@ import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
 public class TraceIdItemTest {
-  private static final TraceIdItem ELEMENT = new TraceIdItem();
+  private static final TraceIdItemAccess ELEMENT = new TraceIdItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -74,7 +74,7 @@ public class TraceIdItemTest {
     when(routingContext.data()).thenReturn(data);
     data.put(RestConst.REST_INVOCATION_CONTEXT, invocation);
 
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is(traceIdTest));
   }
 
@@ -85,7 +85,7 @@ public class TraceIdItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getContext()).thenReturn(clientContext);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is(traceIdTest));
   }
 
@@ -99,7 +99,7 @@ public class TraceIdItemTest {
 
     when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(traceIdTest);
     when(routingContext.request()).thenReturn(serverRequest);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is(traceIdTest));
   }
 
@@ -112,12 +112,12 @@ public class TraceIdItemTest {
 
     when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(null);
     when(routingContext.request()).thenReturn(serverRequest);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is("-"));
 
     strBuilder = new StringBuilder();
     when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is("-"));
   }
 
@@ -127,7 +127,7 @@ public class TraceIdItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getContext()).thenReturn(clientContext);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is("-"));
   }
 
@@ -136,7 +136,7 @@ public class TraceIdItemTest {
     when(routingContext.data()).thenReturn(null);
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is("-"));
   }
 
@@ -145,7 +145,7 @@ public class TraceIdItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getContext()).thenReturn(null);
 
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is("-"));
   }
 
@@ -154,7 +154,7 @@ public class TraceIdItemTest {
     when(serverRequest.getHeader(Const.TRACE_ID_NAME)).thenReturn(null);
     when(routingContext.request()).thenReturn(serverRequest);
     when(routingContext.data()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertThat(strBuilder.toString(), is("-"));
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/TransportItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TransportItemTest.java
similarity index 86%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/TransportItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TransportItemTest.java
index e3da5f4..21dc041 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/TransportItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/TransportItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.mockito.Mockito.when;
 
@@ -29,7 +29,7 @@ import org.junit.Test;
 import org.mockito.Mockito;
 
 public class TransportItemTest {
-  private static final TransportItem ITEM = new TransportItem();
+  private static final TransportItemAccess ITEM = new TransportItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -54,21 +54,21 @@ public class TransportItemTest {
   public void clientFormattedElement() {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getConfigTransportName()).thenReturn("rest");
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("rest", strBuilder.toString());
 
     strBuilder = new StringBuilder();
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getEndpoint()).thenReturn("rest:xxx:30100");
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("rest", strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElement() {
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
-    Assert.assertEquals("-", strBuilder.toString());
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
+    Assert.assertEquals("rest", strBuilder.toString());
   }
 
   @Test
@@ -80,7 +80,7 @@ public class TransportItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getEndpoint()).thenReturn("rest:xxx:30100");
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("rest", strBuilder.toString());
   }
 
@@ -92,7 +92,7 @@ public class TransportItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(endpoint);
     when(endpoint.getEndpoint()).thenReturn("rest:xxx:30100");
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("rest", strBuilder.toString());
   }
 
@@ -103,7 +103,7 @@ public class TransportItemTest {
     strBuilder = new StringBuilder();
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getEndpoint()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java
similarity index 90%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java
index 00183fe..e7121a2 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.mockito.Mockito.when;
 
@@ -40,7 +40,7 @@ import io.vertx.core.http.HttpServerRequest;
 import io.vertx.ext.web.RoutingContext;
 
 public class UrlPathItemTest {
-  private static final UrlPathItem ITEM = new UrlPathItem();
+  private static final UrlPathItemAccess ITEM = new UrlPathItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -91,7 +91,7 @@ public class UrlPathItemTest {
     when(swagger.getBasePath()).thenReturn("/base");
     when(operationMeta.getOperationPath()).thenReturn("/test");
 
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals(uri, strBuilder.toString());
 
     strBuilder = new StringBuilder();
@@ -103,7 +103,7 @@ public class UrlPathItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerContext);
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.path()).thenReturn(uri);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals(uri, strBuilder.toString());
   }
 
@@ -112,14 +112,14 @@ public class UrlPathItemTest {
     String uri = "/test";
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.path()).thenReturn(uri);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals(uri, strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnRequestIsNull() {
     when(routingContext.request()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -130,7 +130,7 @@ public class UrlPathItemTest {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getHandlerContext()).thenReturn(handlerContext);
     when(restClientRequest.getRequest()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -138,7 +138,7 @@ public class UrlPathItemTest {
   public void serverFormattedElementOnMethodIsNull() {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.path()).thenReturn(null);
-    ITEM.appendFormattedItem(accessLogEvent, strBuilder);
+    ITEM.appendServerFormattedItem(accessLogEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 
@@ -150,7 +150,7 @@ public class UrlPathItemTest {
     when(invocation.getHandlerContext()).thenReturn(handlerContext);
     when(restClientRequest.getRequest()).thenReturn(clientRequest);
     when(clientRequest.path()).thenReturn(null);
-    ITEM.appendFormattedItem(finishEvent, strBuilder);
+    ITEM.appendClientFormattedItem(finishEvent, strBuilder);
     Assert.assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathWithQueryItemTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathWithQueryItemTest.java
similarity index 84%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathWithQueryItemTest.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathWithQueryItemTest.java
index b17fbb6..e839dc8 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UrlPathWithQueryItemTest.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UrlPathWithQueryItemTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
@@ -33,7 +33,7 @@ import io.vertx.ext.web.RoutingContext;
 
 public class UrlPathWithQueryItemTest {
 
-  public static final UrlPathWithQueryItem ELEMENT = new UrlPathWithQueryItem();
+  public static final UrlPathWithQueryItemAccess ELEMENT = new UrlPathWithQueryItemAccess();
 
   private StringBuilder strBuilder;
 
@@ -64,7 +64,7 @@ public class UrlPathWithQueryItemTest {
     String uri = "uriTest";
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.uri()).thenReturn(uri);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals(uri, strBuilder.toString());
   }
 
@@ -73,21 +73,21 @@ public class UrlPathWithQueryItemTest {
     String uri = "uriTest";
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getLocalContext(RestConst.REST_CLIENT_REQUEST_PATH)).thenReturn(uri);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals(uri, strBuilder.toString());
   }
 
   @Test
   public void serverFormattedElementOnRequestIsNull() {
     when(routingContext.request()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
   @Test
   public void clientFormattedElementOnRequestIsNull() {
     when(finishEvent.getInvocation()).thenReturn(null);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -95,7 +95,7 @@ public class UrlPathWithQueryItemTest {
   public void serverFormattedElementOnUriIsNull() {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.uri()).thenReturn(null);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -103,7 +103,7 @@ public class UrlPathWithQueryItemTest {
   public void clientFormattedElementOnUriIsNull() {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getLocalContext(RestConst.REST_CLIENT_REQUEST_PATH)).thenReturn(null);
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -111,7 +111,7 @@ public class UrlPathWithQueryItemTest {
   public void serverFormattedElementOnUriIsEmpty() {
     when(routingContext.request()).thenReturn(serverRequest);
     when(serverRequest.uri()).thenReturn("");
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
+    ELEMENT.appendServerFormattedItem(accessLogEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 
@@ -119,7 +119,7 @@ public class UrlPathWithQueryItemTest {
   public void clientFormattedElementOnUriIsEmpty() {
     when(finishEvent.getInvocation()).thenReturn(invocation);
     when(invocation.getLocalContext(RestConst.REST_CLIENT_REQUEST_PATH)).thenReturn("");
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
+    ELEMENT.appendClientFormattedItem(finishEvent, strBuilder);
     assertEquals("-", strBuilder.toString());
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UserDefinedAccessLogItem.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UserDefinedAccessAccessLogItem.java
similarity index 71%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UserDefinedAccessLogItem.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UserDefinedAccessAccessLogItem.java
index da948c0..fc0102b 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UserDefinedAccessLogItem.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UserDefinedAccessAccessLogItem.java
@@ -15,33 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
 /**
  * For access log extension test
  */
-public class UserDefinedAccessLogItem implements LogItem<RoutingContext> {
+public class UserDefinedAccessAccessLogItem implements AccessLogItem<RoutingContext> {
   private String config;
 
-  public UserDefinedAccessLogItem(String config) {
+  public UserDefinedAccessAccessLogItem(String config) {
     this.config = config;
   }
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append("user-defined-")
         .append(config);
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
     builder.append("user-defined-")
         .append(config);
   }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UserDefinedAccessLogItemLowPriority.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UserDefinedAccessAccessLogItemLowPriority.java
similarity index 71%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UserDefinedAccessLogItemLowPriority.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UserDefinedAccessAccessLogItemLowPriority.java
index 8104129..2cf864f 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/UserDefinedAccessLogItemLowPriority.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/element/impl/UserDefinedAccessAccessLogItemLowPriority.java
@@ -15,27 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.element.impl;
+package org.apache.servicecomb.common.accessLog.core.element.impl;
 
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
 
 import io.vertx.ext.web.RoutingContext;
 
 /**
- * For access log extension test, will be overridden by {@link RemoteHostItem}("%h"),
+ * For access log extension test, will be overridden by {@link RemoteHostItemAccess}("%h"),
  * and takes no effect.
  */
-public class UserDefinedAccessLogItemLowPriority implements LogItem<RoutingContext> {
+public class UserDefinedAccessAccessLogItemLowPriority implements AccessLogItem<RoutingContext> {
 
   @Override
-  public void appendFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
+  public void appendServerFormattedItem(ServerAccessLogEvent accessLogEvent, StringBuilder builder) {
     builder.append("OverriddenItem");
   }
 
   @Override
-  public void appendFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
+  public void appendClientFormattedItem(InvocationFinishEvent clientLogEvent, StringBuilder builder) {
     builder.append("OverriddenItem");
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/TestCompositeExtendedAccessLogItemMeta.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/TestCompositeExtendedAccessAccessLogItemMeta.java
similarity index 56%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/TestCompositeExtendedAccessLogItemMeta.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/TestCompositeExtendedAccessAccessLogItemMeta.java
index a14913b..e44a5f0 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/TestCompositeExtendedAccessLogItemMeta.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/TestCompositeExtendedAccessAccessLogItemMeta.java
@@ -15,25 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser.impl;
+package org.apache.servicecomb.common.accessLog.core.parser.impl;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.servicecomb.foundation.log.core.element.impl.UserDefinedAccessLogItem;
-import org.apache.servicecomb.foundation.log.core.parser.CompositeVertxRestLogItemMeta;
-import org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta;
+import org.apache.servicecomb.common.accessLog.core.element.impl.UserDefinedAccessAccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.parser.CompositeVertxRestAccessLogItemMeta;
+import org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta;
 
 
-public class TestCompositeExtendedAccessLogItemMeta extends CompositeVertxRestLogItemMeta {
-  private static final List<VertxRestLogItemMeta> META_LIST = new ArrayList<>();
+public class TestCompositeExtendedAccessAccessLogItemMeta extends CompositeVertxRestAccessLogItemMeta {
+  private static final List<VertxRestAccessLogItemMeta> META_LIST = new ArrayList<>();
 
   static {
-    META_LIST.add(new VertxRestLogItemMeta("%{", "}user-defined", UserDefinedAccessLogItem::new));
+    META_LIST.add(new VertxRestAccessLogItemMeta("%{", "}user-defined", UserDefinedAccessAccessLogItem::new));
   }
 
   @Override
-  public List<VertxRestLogItemMeta> getAccessLogItemMetas() {
+  public List<VertxRestAccessLogItemMeta> getAccessLogItemMetas() {
     return META_LIST;
   }
 }
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/TestSingleExtendedAccessLogItemMeta.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/TestSingleExtendedAccessAccessLogItemMeta.java
similarity index 62%
rename from foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/TestSingleExtendedAccessLogItemMeta.java
rename to common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/TestSingleExtendedAccessAccessLogItemMeta.java
index 46926a3..84ad0d5 100644
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/TestSingleExtendedAccessLogItemMeta.java
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/TestSingleExtendedAccessAccessLogItemMeta.java
@@ -15,13 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.foundation.log.core.parser.impl;
+package org.apache.servicecomb.common.accessLog.core.parser.impl;
 
-import org.apache.servicecomb.foundation.log.core.element.impl.UserDefinedAccessLogItemLowPriority;
-import org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta;
 
-public class TestSingleExtendedAccessLogItemMeta extends VertxRestLogItemMeta {
-  public TestSingleExtendedAccessLogItemMeta() {
-    super("%h", null, config -> new UserDefinedAccessLogItemLowPriority(), 1);
+import org.apache.servicecomb.common.accessLog.core.element.impl.UserDefinedAccessAccessLogItemLowPriority;
+import org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta;
+
+public class TestSingleExtendedAccessAccessLogItemMeta extends VertxRestAccessLogItemMeta {
+  public TestSingleExtendedAccessAccessLogItemMeta() {
+    super("%h", null, config -> new UserDefinedAccessAccessLogItemLowPriority(), 1);
   }
 }
diff --git a/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParserTest.java b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParserTest.java
new file mode 100644
index 0000000..61d42e9
--- /dev/null
+++ b/common/common-access-log/src/test/java/org/apache/servicecomb/common/accessLog/core/parser/impl/VertxRestAccessLogPatternParserTest.java
@@ -0,0 +1,362 @@
+/*
+ * 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.common.accessLog.core.parser.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.servicecomb.common.accessLog.core.element.AccessLogItem;
+import org.apache.servicecomb.common.accessLog.core.element.impl.CookieItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DatetimeConfigurableItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DurationMillisecondItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.DurationSecondItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.FirstLineOfRequestItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.HttpMethodItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.HttpStatusItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.InvocationContextItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.LocalHostItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.LocalPortItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.QueryStringItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RemoteHostItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RequestHeaderItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.RequestProtocolItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.ResponseHeaderItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.ResponseSizeItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.TraceIdItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.TransportItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.UrlPathItemAccess;
+import org.apache.servicecomb.common.accessLog.core.element.impl.UrlPathWithQueryItemAccess;
+import org.apache.servicecomb.common.accessLog.core.parser.CompositeVertxRestAccessLogItemMeta;
+import org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta;
+import org.apache.servicecomb.core.event.ServerAccessLogEvent;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.vertx.ext.web.RoutingContext;
+import mockit.Deencapsulation;
+import mockit.Mock;
+import mockit.MockUp;
+
+public class VertxRestAccessLogPatternParserTest {
+  private static final String ROW_PATTERN = "[cs-method] %m %s%T%D%h%v%p%B%b%r%U%q"
+      + "cs-uri-stemcs-uri-querycs-uri%H%t%{yyyy MM dd HH:mm:ss zzz}t"
+      + "%{yyyy MM dd HH:mm:ss|GMT+0|en-US}t"
+      + "%{incoming-header}i"
+      + "%{outgoing-header}o"
+      + "%{cookie}C"
+      + "%SCB-traceId"
+      + "%{ctx}SCB-ctx"
+      + "%SCB-transport";
+
+  private static VertxRestAccessLogPatternParser logPatternParser = new VertxRestAccessLogPatternParser();
+
+  private ServerAccessLogEvent accessLogEvent;
+
+  private RoutingContext routingContext;
+
+
+  @Before
+  public void initStrBuilder() {
+    routingContext = Mockito.mock(RoutingContext.class);
+    accessLogEvent = new ServerAccessLogEvent();
+    accessLogEvent.setRoutingContext(routingContext);
+  }
+
+  @Test
+  public void testParsePatternFullTest() {
+    List<AccessLogItem<RoutingContext>> result = logPatternParser.parsePattern(ROW_PATTERN);
+    assertEquals(29, result.size());
+    StringBuilder builder = new StringBuilder();
+    result.get(0).appendServerFormattedItem(accessLogEvent, builder);
+    assertEquals("[", builder.toString());
+    assertEquals(HttpMethodItemAccess.class, result.get(1).getClass());
+    builder = new StringBuilder();
+    result.get(2).appendServerFormattedItem(accessLogEvent, builder);
+    assertEquals("] ", builder.toString());
+    assertEquals(HttpMethodItemAccess.class, result.get(3).getClass());
+    builder = new StringBuilder();
+    result.get(4).appendServerFormattedItem(accessLogEvent, builder);
+    assertEquals(" ", builder.toString());
+    assertEquals(HttpStatusItemAccess.class, result.get(5).getClass());
+    assertEquals(DurationSecondItemAccess.class, result.get(6).getClass());
+    assertEquals(DurationMillisecondItemAccess.class, result.get(7).getClass());
+    assertEquals(RemoteHostItemAccess.class, result.get(8).getClass());
+    assertEquals(LocalHostItemAccess.class, result.get(9).getClass());
+    assertEquals(LocalPortItemAccess.class, result.get(10).getClass());
+    assertEquals(ResponseSizeItemAccess.class, result.get(11).getClass());
+    assertEquals("0", ((ResponseSizeItemAccess) result.get(11)).getZeroBytes());
+    assertEquals(ResponseSizeItemAccess.class, result.get(12).getClass());
+    assertEquals("-", ((ResponseSizeItemAccess) result.get(12)).getZeroBytes());
+    assertEquals(FirstLineOfRequestItemAccess.class, result.get(13).getClass());
+    assertEquals(UrlPathItemAccess.class, result.get(14).getClass());
+    assertEquals(QueryStringItemAccess.class, result.get(15).getClass());
+    assertEquals(UrlPathItemAccess.class, result.get(16).getClass());
+    assertEquals(QueryStringItemAccess.class, result.get(17).getClass());
+    assertEquals(UrlPathWithQueryItemAccess.class, result.get(18).getClass());
+    assertEquals(RequestProtocolItemAccess.class, result.get(19).getClass());
+    assertEquals(DatetimeConfigurableItemAccess.class, result.get(20).getClass());
+    assertEquals(DatetimeConfigurableItemAccess.DEFAULT_DATETIME_PATTERN,
+        ((DatetimeConfigurableItemAccess) result.get(20)).getPattern());
+    assertEquals(DatetimeConfigurableItemAccess.DEFAULT_LOCALE, ((DatetimeConfigurableItemAccess) result.get(20)).getLocale());
+    assertEquals(TimeZone.getDefault(), ((DatetimeConfigurableItemAccess) result.get(20)).getTimezone());
+    assertEquals("yyyy MM dd HH:mm:ss zzz", ((DatetimeConfigurableItemAccess) result.get(21)).getPattern());
+    assertEquals(DatetimeConfigurableItemAccess.DEFAULT_LOCALE, ((DatetimeConfigurableItemAccess) result.get(21)).getLocale());
+    assertEquals(TimeZone.getDefault(), ((DatetimeConfigurableItemAccess) result.get(21)).getTimezone());
+    assertEquals("yyyy MM dd HH:mm:ss", ((DatetimeConfigurableItemAccess) result.get(22)).getPattern());
+    assertEquals(Locale.forLanguageTag("en-US"), ((DatetimeConfigurableItemAccess) result.get(22)).getLocale());
+    assertEquals(TimeZone.getTimeZone("GMT+0"), ((DatetimeConfigurableItemAccess) result.get(22)).getTimezone());
+    assertEquals(RequestHeaderItemAccess.class, result.get(23).getClass());
+    assertEquals("incoming-header", ((RequestHeaderItemAccess) result.get(23)).getVarName());
+    assertEquals(ResponseHeaderItemAccess.class, result.get(24).getClass());
+    assertEquals("outgoing-header", ((ResponseHeaderItemAccess) result.get(24)).getVarName());
+    assertEquals(CookieItemAccess.class, result.get(25).getClass());
+    assertEquals("cookie", ((CookieItemAccess) result.get(25)).getVarName());
+    assertEquals(TraceIdItemAccess.class, result.get(26).getClass());
+    assertEquals(InvocationContextItemAccess.class, result.get(27).getClass());
+    assertEquals("ctx", ((InvocationContextItemAccess) result.get(27)).getVarName());
+    assertEquals(TransportItemAccess.class, result.get(28).getClass());
+  }
+
+  @Test
+  public void testParsePattern() {
+    String pattern = " %m  cs-uri-stem %{response-header}o ";
+    List<AccessLogItem<RoutingContext>> result = logPatternParser.parsePattern(pattern);
+    assertEquals(7, result.size());
+    StringBuilder stringBuilder = new StringBuilder();
+    result.get(0).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" ", stringBuilder.toString());
+    assertEquals(HttpMethodItemAccess.class, result.get(1).getClass());
+    stringBuilder = new StringBuilder();
+    result.get(2).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals("  ", stringBuilder.toString());
+    assertEquals(UrlPathItemAccess.class, result.get(3).getClass());
+    stringBuilder = new StringBuilder();
+    result.get(4).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" ", stringBuilder.toString());
+    assertEquals(ResponseHeaderItemAccess.class, result.get(5).getClass());
+    assertEquals("response-header", ((ResponseHeaderItemAccess) result.get(5)).getVarName());
+    stringBuilder = new StringBuilder();
+    result.get(6).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" ", stringBuilder.toString());
+  }
+
+  @Test
+  public void testParsePatternWithNoBlank() {
+    String pattern = "%mcs-uri-stem%{response-header}o";
+    List<AccessLogItem<RoutingContext>> result = logPatternParser.parsePattern(pattern);
+    assertEquals(3, result.size());
+
+    assertEquals(HttpMethodItemAccess.class, result.get(0).getClass());
+    assertEquals(UrlPathItemAccess.class, result.get(1).getClass());
+    assertEquals(ResponseHeaderItemAccess.class, result.get(2).getClass());
+    assertEquals("response-header", ((ResponseHeaderItemAccess) result.get(2)).getVarName());
+  }
+
+  @Test
+  public void testParsePatternComplex() {
+    String pattern = "%m  cs-uri-stem %{response-header}o abc cs-uri-query %s%{request} header}i plain cs-uri";
+    List<AccessLogItem<RoutingContext>> result = logPatternParser.parsePattern(pattern);
+    assertEquals(12, result.size());
+
+    assertEquals(HttpMethodItemAccess.class, result.get(0).getClass());
+    StringBuilder stringBuilder = new StringBuilder();
+    result.get(1).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals("  ", stringBuilder.toString());
+    assertEquals(UrlPathItemAccess.class, result.get(2).getClass());
+    stringBuilder = new StringBuilder();
+    result.get(3).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" ", stringBuilder.toString());
+    assertEquals(ResponseHeaderItemAccess.class, result.get(4).getClass());
+    assertEquals("response-header", ((ResponseHeaderItemAccess) result.get(4)).getVarName());
+    stringBuilder = new StringBuilder();
+    result.get(5).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" abc ", stringBuilder.toString());
+    assertEquals(QueryStringItemAccess.class, result.get(6).getClass());
+    stringBuilder = new StringBuilder();
+    result.get(7).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" ", stringBuilder.toString());
+    assertEquals(HttpStatusItemAccess.class, result.get(8).getClass());
+    assertEquals(RequestHeaderItemAccess.class, result.get(9).getClass());
+    assertEquals("request} header", ((RequestHeaderItemAccess) result.get(9)).getVarName());
+    stringBuilder = new StringBuilder();
+    result.get(10).appendServerFormattedItem(accessLogEvent, stringBuilder);
+    assertEquals(" plain ", stringBuilder.toString());
+    assertEquals(UrlPathWithQueryItemAccess.class, result.get(11).getClass());
+  }
+
+  Comparator<VertxRestAccessLogItemMeta> comparator = VertxRestAccessLogPatternParser.accessLogItemMetaComparator;
+
+  /**
+   * one factor test
+   */
+  @Test
+  public void testCompareMetaSimple() {
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta(null, null, null, 0),
+            new VertxRestAccessLogItemMeta(null, null, null, 1)
+        ) < 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta(null, "}abc", null, 0),
+            new VertxRestAccessLogItemMeta(null, null, null, 0)
+        ) < 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta(null, "}abc", null, 0),
+            new VertxRestAccessLogItemMeta(null, "}de", null, 0)
+        ) < 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta(null, "}abc", null, 0),
+            new VertxRestAccessLogItemMeta(null, "}ab", null, 0)
+        ) < 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta("%abc", null, null, 0),
+            new VertxRestAccessLogItemMeta("%de", null, null, 0)
+        ) < 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta("%abc", null, null, 0),
+            new VertxRestAccessLogItemMeta("%ab", null, null, 0)
+        ) < 0
+    );
+    Assert.assertEquals(0, comparator.compare(
+        new VertxRestAccessLogItemMeta("%abc", null, null, 0),
+        new VertxRestAccessLogItemMeta("%abc", null, null, 0)
+    ));
+  }
+
+  /**
+   * multiple factors test
+   */
+  @Test
+  public void testCompareMetaComplex() {
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta("%bcd", "}ab", null, 0),
+            new VertxRestAccessLogItemMeta("%abc", "}abc", null, 0)
+        ) > 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta("%abc", null, null, 0),
+            new VertxRestAccessLogItemMeta("%bcd", "}ab", null, 0)
+        ) > 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta("%bcd", "}abc", null, 0),
+            new VertxRestAccessLogItemMeta("%abc", "}abc", null, 0)
+        ) > 0
+    );
+    Assert.assertTrue(
+        comparator.compare(
+            new VertxRestAccessLogItemMeta("%abc", "}abc", null, 1),
+            new VertxRestAccessLogItemMeta("%ab", "}ab", null, 0)
+        ) > 0
+    );
+  }
+
+  @Test
+  public void testComparePlaceholderString() {
+    Assert.assertTrue(
+        VertxRestAccessLogPatternParser.comparePlaceholderString("abc", "bbc") < 0
+    );
+    Assert.assertTrue(
+        VertxRestAccessLogPatternParser.comparePlaceholderString("abc", "ab") < 0
+    );
+    Assert.assertEquals(0, VertxRestAccessLogPatternParser.comparePlaceholderString("abc", "abc"));
+    Assert.assertTrue(
+        VertxRestAccessLogPatternParser.comparePlaceholderString("bbc", "abc") > 0
+    );
+    Assert.assertTrue(
+        VertxRestAccessLogPatternParser.comparePlaceholderString("ab", "abc") > 0
+    );
+  }
+
+  @Test
+  public void testExtendedVertxRestAccessLogItemCreator() {
+    final List<VertxRestAccessLogItemMeta> metaList0 = new ArrayList<>();
+    metaList0.add(new VertxRestAccessLogItemMeta("%{", "}abc", null));
+    metaList0.add(new VertxRestAccessLogItemMeta("%{", "}a", null));
+    metaList0.add(new VertxRestAccessLogItemMeta("%_", null, null, -1));
+
+    final List<VertxRestAccessLogItemMeta> metaList1 = new ArrayList<>();
+    metaList0.add(new VertxRestAccessLogItemMeta("%a", "}abc", null));
+    metaList0.add(new VertxRestAccessLogItemMeta("%0", "}abc", null, 1));
+    metaList0.add(new VertxRestAccessLogItemMeta("%m", null, null));
+
+    new MockUp<VertxRestAccessLogPatternParser>() {
+      @Mock
+      List<VertxRestAccessLogItemMeta> loadVertxRestLogItemMeta() {
+        List<VertxRestAccessLogItemMeta> metaList = new ArrayList<>(1);
+        CompositeVertxRestAccessLogItemMeta compositeMeta0 = new CompositeVertxRestAccessLogItemMeta() {
+          @Override
+          public List<VertxRestAccessLogItemMeta> getAccessLogItemMetas() {
+            return metaList0;
+          }
+        };
+        CompositeVertxRestAccessLogItemMeta compositeMeta1 = new CompositeVertxRestAccessLogItemMeta() {
+          @Override
+          public List<VertxRestAccessLogItemMeta> getAccessLogItemMetas() {
+            return metaList1;
+          }
+        };
+        metaList.add(compositeMeta0);
+        metaList.add(compositeMeta1);
+        metaList.add(new VertxRestAccessLogItemMeta("%{", null, null));
+        return metaList;
+      }
+    };
+
+    VertxRestAccessLogPatternParser parser = new VertxRestAccessLogPatternParser();
+
+    List<VertxRestAccessLogItemMeta> accessLogItemMetaList =
+        Deencapsulation.getField(parser, "metaList");
+
+    assertEquals(7, accessLogItemMetaList.size());
+    assertEquals("%_", accessLogItemMetaList.get(0).getPrefix());
+    assertEquals("%a", accessLogItemMetaList.get(1).getPrefix());
+    assertEquals("}abc", accessLogItemMetaList.get(1).getSuffix());
+    assertEquals("%{", accessLogItemMetaList.get(2).getPrefix());
+    assertEquals("}abc", accessLogItemMetaList.get(2).getSuffix());
+    assertEquals("%{", accessLogItemMetaList.get(3).getPrefix());
+    assertEquals("}a", accessLogItemMetaList.get(3).getSuffix());
+    assertEquals("%m", accessLogItemMetaList.get(4).getPrefix());
+    assertNull(accessLogItemMetaList.get(4).getSuffix());
+    assertEquals("%{", accessLogItemMetaList.get(5).getPrefix());
+    assertNull(accessLogItemMetaList.get(5).getSuffix());
+    assertEquals("%0", accessLogItemMetaList.get(6).getPrefix());
+    assertEquals("}abc", accessLogItemMetaList.get(6).getSuffix());
+  }
+}
diff --git a/foundations/foundation-log/src/test/resources/META-INF/services/org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta b/common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
similarity index 79%
rename from foundations/foundation-log/src/test/resources/META-INF/services/org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta
rename to common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
index 1ef1185..07231a0 100644
--- a/foundations/foundation-log/src/test/resources/META-INF/services/org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta
+++ b/common/common-access-log/src/test/resources/META-INF/services/org.apache.servicecomb.common.accessLog.core.parser.VertxRestAccessLogItemMeta
@@ -15,5 +15,5 @@
 # limitations under the License.
 #
 
-org.apache.servicecomb.foundation.log.core.parser.impl.TestCompositeExtendedAccessLogItemMeta
-org.apache.servicecomb.foundation.log.core.parser.impl.TestSingleExtendedAccessLogItemMeta
\ No newline at end of file
+org.apache.servicecomb.common.accessLog.core.parser.impl.TestCompositeExtendedAccessAccessLogItemMeta
+org.apache.servicecomb.common.accessLog.core.parser.impl.TestSingleExtendedAccessAccessLogItemMeta
\ No newline at end of file
diff --git a/common/pom.xml b/common/pom.xml
index 7ffe866..363be4e 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -31,5 +31,6 @@
     <module>common-javassist</module>
     <module>common-protobuf</module>
     <module>common-rest</module>
+    <module>common-access-log</module>
   </modules>
 </project>
diff --git a/dependencies/default/pom.xml b/dependencies/default/pom.xml
index 28a9180..8995b2e 100644
--- a/dependencies/default/pom.xml
+++ b/dependencies/default/pom.xml
@@ -1066,6 +1066,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.servicecomb</groupId>
+        <artifactId>common-access-log</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb</groupId>
         <artifactId>config-apollo</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -1122,11 +1127,6 @@
       </dependency>
       <dependency>
         <groupId>org.apache.servicecomb</groupId>
-        <artifactId>foundation-log</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.servicecomb</groupId>
         <artifactId>foundation-vertx</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/README.md b/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/README.md
deleted file mode 100644
index b9e72c2..0000000
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/README.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# transport-rest-vertx Access Log
-
-## Enable access log printing
-
-To enable access log printing, you can config access log in microservice.yaml like below:
-```yaml
-servicecomb:
-  outlog:
-    enabled: true
-    pattern: "%h %SCB-transport - - %t %r %s %D"
-  accesslog:
-    enabled: true
-    pattern: "%h - - %t %r %s %B %D"
-```
-
-***Access Log Configurations in microservice.yaml***
-
-| Config Item | Range of Value | Default Value | Meaning |
-| :---------- | :------------- | :------------ | :------ |
-| servicecomb.accesslog.enabled | true/false | false | print access log if true |
-| servicecomb.accesslog.pattern | a string field representing log pattern | "%h - - %t %r %s %B" | see details of ***Currently Supported Elements*** below |
-
-> ***Caution:***
-> - all of the configuration items above can be omitted, in this case, default value will take effect.
-
-## Supported log elements
-
-***Currently Supported Elements (Apache & W3C)***
-
-| Element | Apache | W3C | Comment |
-| :----   | :----- | :-- | :------ |
-| HTTP method | %m  | cs-method | |
-| HTTP status | %s  | sc-status | |
-| Duration in second | %T  | - | The time taken to serve the request, in seconds |
-| Duration in millisecond | %D  | - | The time taken to serve the request, in millisecond |
-| Remote hostname | %h  | - | |
-| Local hostname | %v  | - |  |
-| Local port | %p  | - |  |
-| Size of response | %B | - | |
-| Size of response | %b | - | In CLF format, i.e. "-" is written if response size is 0 |
-| First line of request | %r  | - | |
-| URI path | %U | cs-uri-stem | |
-| Query string | %q | cs-uri-query | |
-| URI path and query string | - | cs-uri | |
-| Request protocol | %H | - | |
-| Datetime the request was received | %t | - | Write in default format, i.e. pattern is "EEE, dd MMM yyyy HH:mm:ss zzz", Locale is US and Timezone is GMT |
-| Configurable datetime the request was received | %{PATTERN&#x7C;TIMEZONE&#x7C;LOCALE}t | - | Write datetime in specified format pattern, timezone and locale. TIMEZONE and LOCALE can be omitted |
-| Request Header | %{VARNAME}i  | - | '-' is written if not found |
-| Response header | %{VARNAME}o  | - | '-' is written if not found |
-| Cookie | %{VARNAME}C  | - | '-' is written if not found |
-
-***Currently Supported Elements (ServiceComb)***
-
-| Element | Placeholder | Comment |
-| :----   | :---------- | :------ |
-| TraceId | %SCB-traceId | TraceId provided by ServiceComb |
-| Invocation Context | %{VARNAME}SCB-ctx | Variable carried in invocation context, '-' is written if not found | 
-
-## Access log file settings
-
-Access log will be written in a separate log file named `access.log` located in the same directory with common logs.
-
-Default access log printer is based on Log4j, users can override access log file configuration in their `log4j.properties` file.
-
-***Common access log file configuration items***
-
-| Configuration Item | Default Value | Meaning |
-| :----------------- | :------------ | :------ |
-| paas.logs.accesslog.dir | ${paas.logs.dir} | access log output directory |
-| paas.logs.accesslog.file | access.log | access log file name |
-
-## Access log item reference
-
-- [mod_log_config - Apache HTTP Server Version 2.4](http://httpd.apache.org/docs/2.4/en/mod/mod_log_config.html)
-- [Extended Log File Format](https://www.w3.org/TR/WD-logfile.html)
diff --git a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/impl/DefaultCompositeVertxRestLogItemMeta.java b/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/impl/DefaultCompositeVertxRestLogItemMeta.java
deleted file mode 100644
index b410d61..0000000
--- a/foundations/foundation-log/src/main/java/org/apache/servicecomb/foundation/log/core/parser/impl/DefaultCompositeVertxRestLogItemMeta.java
+++ /dev/null
@@ -1,89 +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.servicecomb.foundation.log.core.parser.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.CookieItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DatetimeConfigurableItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DurationMillisecondItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DurationSecondItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.FirstLineOfRequestItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.HttpMethodItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.HttpStatusItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.TransportItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.InvocationContextItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.LocalHostItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.LocalPortItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.QueryStringItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.RemoteHostItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.RequestHeaderItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.RequestProtocolItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.ResponseHeaderItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.ResponseSizeItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.TraceIdItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.UrlPathItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.UrlPathWithQueryItem;
-import org.apache.servicecomb.foundation.log.core.parser.CompositeVertxRestLogItemMeta;
-import org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta;
-
-import io.vertx.ext.web.RoutingContext;
-
-public class DefaultCompositeVertxRestLogItemMeta extends CompositeVertxRestLogItemMeta {
-  private static final List<VertxRestLogItemMeta> SUPPORTED_META = new ArrayList<>();
-
-  static {
-    final LogItem<RoutingContext> httpMethodItem = new HttpMethodItem();
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%m", config -> httpMethodItem));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("cs-method", config -> httpMethodItem));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%s", config -> new HttpStatusItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("sc-status", config -> new HttpStatusItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%T", config -> new DurationSecondItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%D", config -> new DurationMillisecondItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%h", config -> new RemoteHostItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%v", config -> new LocalHostItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%p", config -> new LocalPortItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%B", config -> new ResponseSizeItem("0")));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%b", config -> new ResponseSizeItem("-")));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%r", config -> new FirstLineOfRequestItem()));
-    final LogItem<RoutingContext> urlPathItem = new UrlPathItem();
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%U", config -> urlPathItem));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("cs-uri-stem", config -> urlPathItem));
-    final LogItem<RoutingContext> queryStringItem = new QueryStringItem();
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%q", config -> queryStringItem));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("cs-uri-query", config -> queryStringItem));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("cs-uri", config -> new UrlPathWithQueryItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%H", config -> new RequestProtocolItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%t", config -> new DatetimeConfigurableItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%SCB-traceId", config -> new TraceIdItem()));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%SCB-transport", config -> new TransportItem()));
-
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%{", "}t", DatetimeConfigurableItem::new));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%{", "}i", RequestHeaderItem::new));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%{", "}o", ResponseHeaderItem::new));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%{", "}C", CookieItem::new));
-    SUPPORTED_META.add(new VertxRestLogItemMeta("%{", "}SCB-ctx", InvocationContextItem::new));
-  }
-
-  @Override
-  public List<VertxRestLogItemMeta> getAccessLogItemMetas() {
-    return SUPPORTED_META;
-  }
-}
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalHostItemTest.java b/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalHostItemTest.java
deleted file mode 100644
index 18d5471..0000000
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/element/impl/LocalHostItemTest.java
+++ /dev/null
@@ -1,120 +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.servicecomb.foundation.log.core.element.impl;
-
-import static org.junit.Assert.assertEquals;
-
-import org.apache.servicecomb.core.event.InvocationFinishEvent;
-import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import io.vertx.core.http.HttpServerRequest;
-import io.vertx.core.net.SocketAddress;
-import io.vertx.ext.web.RoutingContext;
-
-public class LocalHostItemTest {
-  public static final LocalHostItem ELEMENT = new LocalHostItem();
-
-  private StringBuilder strBuilder;
-
-  private InvocationFinishEvent finishEvent;
-
-  private ServerAccessLogEvent accessLogEvent;
-
-  private RoutingContext routingContext;
-
-  private HttpServerRequest serverRequest;
-
-  private SocketAddress socketAddress;
-
-  @Before
-  public void initStrBuilder() {
-    accessLogEvent = new ServerAccessLogEvent();
-    routingContext = Mockito.mock(RoutingContext.class);
-    finishEvent = Mockito.mock(InvocationFinishEvent.class);
-    serverRequest = Mockito.mock(HttpServerRequest.class);
-    socketAddress = Mockito.mock(SocketAddress.class);
-
-    accessLogEvent.setRoutingContext(routingContext);
-    strBuilder = new StringBuilder();
-  }
-
-  @Test
-  public void clientFormattedItem() {
-    ELEMENT.appendFormattedItem(finishEvent, strBuilder);
-    Assert.assertEquals("-", strBuilder.toString());
-  }
-
-  @Test
-  public void serverFormattedItem() {
-    String localAddress = "192.168.0.1";
-    accessLogEvent.setLocalAddress(localAddress);
-    ELEMENT.appendFormattedItem(accessLogEvent, strBuilder);
-    Assert.assertEquals(localAddress, strBuilder.toString());
-  }
-
-  @Test
-  public void getLocalAddress() {
-    String localHost = "testHost";
-    Mockito.when(routingContext.request()).thenReturn(serverRequest);
-    Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
-    Mockito.when(socketAddress.host()).thenReturn(localHost);
-
-    String result = LocalHostItem.getLocalAddress(routingContext);
-    assertEquals(localHost, result);
-  }
-
-  @Test
-  public void getLocalAddressOnRequestIsNull() {
-    Mockito.when(routingContext.request()).thenReturn(null);
-    String result = LocalHostItem.getLocalAddress(routingContext);
-    assertEquals("-", result);
-  }
-
-  @Test
-  public void getLocalAddressOnLocalAddressIsNull() {
-    Mockito.when(routingContext.request()).thenReturn(serverRequest);
-    Mockito.when(serverRequest.localAddress()).thenReturn(null);
-    String result = LocalHostItem.getLocalAddress(routingContext);
-    assertEquals("-", result);
-  }
-
-  @Test
-  public void getLocalAddressOnHostIsNull() {
-    Mockito.when(routingContext.request()).thenReturn(serverRequest);
-    Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
-    Mockito.when(socketAddress.host()).thenReturn(null);
-
-    String result = LocalHostItem.getLocalAddress(routingContext);
-    assertEquals("-", result);
-  }
-
-  @Test
-  public void getLocalAddressIsEmpty() {
-    String localHost = "";
-    Mockito.when(routingContext.request()).thenReturn(serverRequest);
-    Mockito.when(serverRequest.localAddress()).thenReturn(socketAddress);
-    Mockito.when(socketAddress.host()).thenReturn(localHost);
-
-    String result = LocalHostItem.getLocalAddress(routingContext);
-    assertEquals("-", result);
-  }
-}
diff --git a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/VertxRestAccessLogPatternParserTest.java b/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/VertxRestAccessLogPatternParserTest.java
deleted file mode 100644
index 66dfeed..0000000
--- a/foundations/foundation-log/src/test/java/org/apache/servicecomb/foundation/log/core/parser/impl/VertxRestAccessLogPatternParserTest.java
+++ /dev/null
@@ -1,362 +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.servicecomb.foundation.log.core.parser.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.apache.servicecomb.core.event.ServerAccessLogEvent;
-import org.apache.servicecomb.foundation.log.core.element.LogItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.CookieItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DatetimeConfigurableItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DurationMillisecondItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.DurationSecondItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.FirstLineOfRequestItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.HttpMethodItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.HttpStatusItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.InvocationContextItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.LocalHostItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.LocalPortItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.QueryStringItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.RemoteHostItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.RequestHeaderItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.RequestProtocolItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.ResponseHeaderItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.ResponseSizeItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.TraceIdItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.TransportItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.UrlPathItem;
-import org.apache.servicecomb.foundation.log.core.element.impl.UrlPathWithQueryItem;
-import org.apache.servicecomb.foundation.log.core.parser.CompositeVertxRestLogItemMeta;
-import org.apache.servicecomb.foundation.log.core.parser.VertxRestLogItemMeta;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import io.vertx.ext.web.RoutingContext;
-import mockit.Deencapsulation;
-import mockit.Mock;
-import mockit.MockUp;
-
-public class VertxRestAccessLogPatternParserTest {
-  private static final String ROW_PATTERN = "[cs-method] %m %s%T%D%h%v%p%B%b%r%U%q"
-      + "cs-uri-stemcs-uri-querycs-uri%H%t%{yyyy MM dd HH:mm:ss zzz}t"
-      + "%{yyyy MM dd HH:mm:ss|GMT+0|en-US}t"
-      + "%{incoming-header}i"
-      + "%{outgoing-header}o"
-      + "%{cookie}C"
-      + "%SCB-traceId"
-      + "%{ctx}SCB-ctx"
-      + "%SCB-transport";
-
-  private static VertxRestLogPatternParser logPatternParser = new VertxRestLogPatternParser();
-
-  private ServerAccessLogEvent accessLogEvent;
-
-  private RoutingContext routingContext;
-
-
-  @Before
-  public void initStrBuilder() {
-    routingContext = Mockito.mock(RoutingContext.class);
-    accessLogEvent = new ServerAccessLogEvent();
-    accessLogEvent.setRoutingContext(routingContext);
-  }
-
-  @Test
-  public void testParsePatternFullTest() {
-    List<LogItem<RoutingContext>> result = logPatternParser.parsePattern(ROW_PATTERN);
-    assertEquals(29, result.size());
-    StringBuilder builder = new StringBuilder();
-    result.get(0).appendFormattedItem(accessLogEvent, builder);
-    assertEquals("[", builder.toString());
-    assertEquals(HttpMethodItem.class, result.get(1).getClass());
-    builder = new StringBuilder();
-    result.get(2).appendFormattedItem(accessLogEvent, builder);
-    assertEquals("] ", builder.toString());
-    assertEquals(HttpMethodItem.class, result.get(3).getClass());
-    builder = new StringBuilder();
-    result.get(4).appendFormattedItem(accessLogEvent, builder);
-    assertEquals(" ", builder.toString());
-    assertEquals(HttpStatusItem.class, result.get(5).getClass());
-    assertEquals(DurationSecondItem.class, result.get(6).getClass());
-    assertEquals(DurationMillisecondItem.class, result.get(7).getClass());
-    assertEquals(RemoteHostItem.class, result.get(8).getClass());
-    assertEquals(LocalHostItem.class, result.get(9).getClass());
-    assertEquals(LocalPortItem.class, result.get(10).getClass());
-    assertEquals(ResponseSizeItem.class, result.get(11).getClass());
-    assertEquals("0", ((ResponseSizeItem) result.get(11)).getZeroBytes());
-    assertEquals(ResponseSizeItem.class, result.get(12).getClass());
-    assertEquals("-", ((ResponseSizeItem) result.get(12)).getZeroBytes());
-    assertEquals(FirstLineOfRequestItem.class, result.get(13).getClass());
-    assertEquals(UrlPathItem.class, result.get(14).getClass());
-    assertEquals(QueryStringItem.class, result.get(15).getClass());
-    assertEquals(UrlPathItem.class, result.get(16).getClass());
-    assertEquals(QueryStringItem.class, result.get(17).getClass());
-    assertEquals(UrlPathWithQueryItem.class, result.get(18).getClass());
-    assertEquals(RequestProtocolItem.class, result.get(19).getClass());
-    assertEquals(DatetimeConfigurableItem.class, result.get(20).getClass());
-    assertEquals(DatetimeConfigurableItem.DEFAULT_DATETIME_PATTERN,
-        ((DatetimeConfigurableItem) result.get(20)).getPattern());
-    assertEquals(DatetimeConfigurableItem.DEFAULT_LOCALE, ((DatetimeConfigurableItem) result.get(20)).getLocale());
-    assertEquals(TimeZone.getDefault(), ((DatetimeConfigurableItem) result.get(20)).getTimezone());
-    assertEquals("yyyy MM dd HH:mm:ss zzz", ((DatetimeConfigurableItem) result.get(21)).getPattern());
-    assertEquals(DatetimeConfigurableItem.DEFAULT_LOCALE, ((DatetimeConfigurableItem) result.get(21)).getLocale());
-    assertEquals(TimeZone.getDefault(), ((DatetimeConfigurableItem) result.get(21)).getTimezone());
-    assertEquals("yyyy MM dd HH:mm:ss", ((DatetimeConfigurableItem) result.get(22)).getPattern());
-    assertEquals(Locale.forLanguageTag("en-US"), ((DatetimeConfigurableItem) result.get(22)).getLocale());
-    assertEquals(TimeZone.getTimeZone("GMT+0"), ((DatetimeConfigurableItem) result.get(22)).getTimezone());
-    assertEquals(RequestHeaderItem.class, result.get(23).getClass());
-    assertEquals("incoming-header", ((RequestHeaderItem) result.get(23)).getVarName());
-    assertEquals(ResponseHeaderItem.class, result.get(24).getClass());
-    assertEquals("outgoing-header", ((ResponseHeaderItem) result.get(24)).getVarName());
-    assertEquals(CookieItem.class, result.get(25).getClass());
-    assertEquals("cookie", ((CookieItem) result.get(25)).getVarName());
-    assertEquals(TraceIdItem.class, result.get(26).getClass());
-    assertEquals(InvocationContextItem.class, result.get(27).getClass());
-    assertEquals("ctx", ((InvocationContextItem) result.get(27)).getVarName());
-    assertEquals(TransportItem.class, result.get(28).getClass());
-  }
-
-  @Test
-  public void testParsePattern() {
-    String pattern = " %m  cs-uri-stem %{response-header}o ";
-    List<LogItem<RoutingContext>> result = logPatternParser.parsePattern(pattern);
-    assertEquals(7, result.size());
-    StringBuilder stringBuilder = new StringBuilder();
-    result.get(0).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" ", stringBuilder.toString());
-    assertEquals(HttpMethodItem.class, result.get(1).getClass());
-    stringBuilder = new StringBuilder();
-    result.get(2).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals("  ", stringBuilder.toString());
-    assertEquals(UrlPathItem.class, result.get(3).getClass());
-    stringBuilder = new StringBuilder();
-    result.get(4).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" ", stringBuilder.toString());
-    assertEquals(ResponseHeaderItem.class, result.get(5).getClass());
-    assertEquals("response-header", ((ResponseHeaderItem) result.get(5)).getVarName());
-    stringBuilder = new StringBuilder();
-    result.get(6).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" ", stringBuilder.toString());
-  }
-
-  @Test
-  public void testParsePatternWithNoBlank() {
-    String pattern = "%mcs-uri-stem%{response-header}o";
-    List<LogItem<RoutingContext>> result = logPatternParser.parsePattern(pattern);
-    assertEquals(3, result.size());
-
-    assertEquals(HttpMethodItem.class, result.get(0).getClass());
-    assertEquals(UrlPathItem.class, result.get(1).getClass());
-    assertEquals(ResponseHeaderItem.class, result.get(2).getClass());
-    assertEquals("response-header", ((ResponseHeaderItem) result.get(2)).getVarName());
-  }
-
-  @Test
-  public void testParsePatternComplex() {
-    String pattern = "%m  cs-uri-stem %{response-header}o abc cs-uri-query %s%{request} header}i plain cs-uri";
-    List<LogItem<RoutingContext>> result = logPatternParser.parsePattern(pattern);
-    assertEquals(12, result.size());
-
-    assertEquals(HttpMethodItem.class, result.get(0).getClass());
-    StringBuilder stringBuilder = new StringBuilder();
-    result.get(1).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals("  ", stringBuilder.toString());
-    assertEquals(UrlPathItem.class, result.get(2).getClass());
-    stringBuilder = new StringBuilder();
-    result.get(3).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" ", stringBuilder.toString());
-    assertEquals(ResponseHeaderItem.class, result.get(4).getClass());
-    assertEquals("response-header", ((ResponseHeaderItem) result.get(4)).getVarName());
-    stringBuilder = new StringBuilder();
-    result.get(5).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" abc ", stringBuilder.toString());
-    assertEquals(QueryStringItem.class, result.get(6).getClass());
-    stringBuilder = new StringBuilder();
-    result.get(7).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" ", stringBuilder.toString());
-    assertEquals(HttpStatusItem.class, result.get(8).getClass());
-    assertEquals(RequestHeaderItem.class, result.get(9).getClass());
-    assertEquals("request} header", ((RequestHeaderItem) result.get(9)).getVarName());
-    stringBuilder = new StringBuilder();
-    result.get(10).appendFormattedItem(accessLogEvent, stringBuilder);
-    assertEquals(" plain ", stringBuilder.toString());
-    assertEquals(UrlPathWithQueryItem.class, result.get(11).getClass());
-  }
-
-  Comparator<VertxRestLogItemMeta> comparator = VertxRestLogPatternParser.accessLogItemMetaComparator;
-
-  /**
-   * one factor test
-   */
-  @Test
-  public void testCompareMetaSimple() {
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta(null, null, null, 0),
-            new VertxRestLogItemMeta(null, null, null, 1)
-        ) < 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta(null, "}abc", null, 0),
-            new VertxRestLogItemMeta(null, null, null, 0)
-        ) < 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta(null, "}abc", null, 0),
-            new VertxRestLogItemMeta(null, "}de", null, 0)
-        ) < 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta(null, "}abc", null, 0),
-            new VertxRestLogItemMeta(null, "}ab", null, 0)
-        ) < 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta("%abc", null, null, 0),
-            new VertxRestLogItemMeta("%de", null, null, 0)
-        ) < 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta("%abc", null, null, 0),
-            new VertxRestLogItemMeta("%ab", null, null, 0)
-        ) < 0
-    );
-    Assert.assertEquals(0, comparator.compare(
-        new VertxRestLogItemMeta("%abc", null, null, 0),
-        new VertxRestLogItemMeta("%abc", null, null, 0)
-    ));
-  }
-
-  /**
-   * multiple factors test
-   */
-  @Test
-  public void testCompareMetaComplex() {
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta("%bcd", "}ab", null, 0),
-            new VertxRestLogItemMeta("%abc", "}abc", null, 0)
-        ) > 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta("%abc", null, null, 0),
-            new VertxRestLogItemMeta("%bcd", "}ab", null, 0)
-        ) > 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta("%bcd", "}abc", null, 0),
-            new VertxRestLogItemMeta("%abc", "}abc", null, 0)
-        ) > 0
-    );
-    Assert.assertTrue(
-        comparator.compare(
-            new VertxRestLogItemMeta("%abc", "}abc", null, 1),
-            new VertxRestLogItemMeta("%ab", "}ab", null, 0)
-        ) > 0
-    );
-  }
-
-  @Test
-  public void testComparePlaceholderString() {
-    Assert.assertTrue(
-        VertxRestLogPatternParser.comparePlaceholderString("abc", "bbc") < 0
-    );
-    Assert.assertTrue(
-        VertxRestLogPatternParser.comparePlaceholderString("abc", "ab") < 0
-    );
-    Assert.assertEquals(0, VertxRestLogPatternParser.comparePlaceholderString("abc", "abc"));
-    Assert.assertTrue(
-        VertxRestLogPatternParser.comparePlaceholderString("bbc", "abc") > 0
-    );
-    Assert.assertTrue(
-        VertxRestLogPatternParser.comparePlaceholderString("ab", "abc") > 0
-    );
-  }
-
-  @Test
-  public void testExtendedVertxRestAccessLogItemCreator() {
-    final List<VertxRestLogItemMeta> metaList0 = new ArrayList<>();
-    metaList0.add(new VertxRestLogItemMeta("%{", "}abc", null));
-    metaList0.add(new VertxRestLogItemMeta("%{", "}a", null));
-    metaList0.add(new VertxRestLogItemMeta("%_", null, null, -1));
-
-    final List<VertxRestLogItemMeta> metaList1 = new ArrayList<>();
-    metaList0.add(new VertxRestLogItemMeta("%a", "}abc", null));
-    metaList0.add(new VertxRestLogItemMeta("%0", "}abc", null, 1));
-    metaList0.add(new VertxRestLogItemMeta("%m", null, null));
-
-    new MockUp<VertxRestLogPatternParser>() {
-      @Mock
-      List<VertxRestLogItemMeta> loadVertxRestLogItemMeta() {
-        List<VertxRestLogItemMeta> metaList = new ArrayList<>(1);
-        CompositeVertxRestLogItemMeta compositeMeta0 = new CompositeVertxRestLogItemMeta() {
-          @Override
-          public List<VertxRestLogItemMeta> getAccessLogItemMetas() {
-            return metaList0;
-          }
-        };
-        CompositeVertxRestLogItemMeta compositeMeta1 = new CompositeVertxRestLogItemMeta() {
-          @Override
-          public List<VertxRestLogItemMeta> getAccessLogItemMetas() {
-            return metaList1;
-          }
-        };
-        metaList.add(compositeMeta0);
-        metaList.add(compositeMeta1);
-        metaList.add(new VertxRestLogItemMeta("%{", null, null));
-        return metaList;
-      }
-    };
-
-    VertxRestLogPatternParser parser = new VertxRestLogPatternParser();
-
-    List<VertxRestLogItemMeta> accessLogItemMetaList =
-        Deencapsulation.getField(parser, "metaList");
-
-    assertEquals(7, accessLogItemMetaList.size());
-    assertEquals("%_", accessLogItemMetaList.get(0).getPrefix());
-    assertEquals("%a", accessLogItemMetaList.get(1).getPrefix());
-    assertEquals("}abc", accessLogItemMetaList.get(1).getSuffix());
-    assertEquals("%{", accessLogItemMetaList.get(2).getPrefix());
-    assertEquals("}abc", accessLogItemMetaList.get(2).getSuffix());
-    assertEquals("%{", accessLogItemMetaList.get(3).getPrefix());
-    assertEquals("}a", accessLogItemMetaList.get(3).getSuffix());
-    assertEquals("%m", accessLogItemMetaList.get(4).getPrefix());
-    assertNull(accessLogItemMetaList.get(4).getSuffix());
-    assertEquals("%{", accessLogItemMetaList.get(5).getPrefix());
-    assertNull(accessLogItemMetaList.get(5).getSuffix());
-    assertEquals("%0", accessLogItemMetaList.get(6).getPrefix());
-    assertEquals("}abc", accessLogItemMetaList.get(6).getSuffix());
-  }
-}
diff --git a/transports/transport-rest/transport-rest-vertx/pom.xml b/transports/transport-rest/transport-rest-vertx/pom.xml
index 7bc43d9..a1be5e7 100644
--- a/transports/transport-rest/transport-rest-vertx/pom.xml
+++ b/transports/transport-rest/transport-rest-vertx/pom.xml
@@ -33,10 +33,6 @@
       <artifactId>transport-rest-client</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>foundation-log</artifactId>
-    </dependency>
-    <dependency>
       <groupId>io.vertx</groupId>
       <artifactId>vertx-codegen</artifactId>
       <scope>provided</scope>
@@ -56,5 +52,9 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-test-scaffolding</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>common-access-log</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
index 15de1da..5ffe923 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
@@ -24,6 +24,8 @@ import java.util.Set;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 
+import org.apache.servicecomb.common.accessLog.AccessLogConfig;
+import org.apache.servicecomb.common.accessLog.core.element.impl.LocalHostItemAccess;
 import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.event.ServerAccessLogEvent;
@@ -32,8 +34,7 @@ import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.foundation.common.utils.ExceptionUtils;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.foundation.log.LogConfig;
-import org.apache.servicecomb.foundation.log.core.element.impl.LocalHostItem;
+
 import org.apache.servicecomb.foundation.ssl.SSLCustom;
 import org.apache.servicecomb.foundation.ssl.SSLOption;
 import org.apache.servicecomb.foundation.ssl.SSLOptionFactory;
@@ -163,15 +164,15 @@ public class RestServerVerticle extends AbstractVerticle {
   }
 
   private void mountAccessLogHandler(Router mainRouter) {
-    if (!LogConfig.INSTANCE.isServerLogEnabled()) {
+    if (!AccessLogConfig.INSTANCE.isServerLogEnabled()) {
       return;
     }
-    LOGGER.info("access log enabled, pattern = {}", LogConfig.INSTANCE.getServerLogPattern());
+    LOGGER.info("access log enabled, pattern = {}", AccessLogConfig.INSTANCE.getServerLogPattern());
     mainRouter.route().handler(context -> {
       ServerAccessLogEvent accessLogEvent = new ServerAccessLogEvent()
           .setRoutingContext(context)
           .setMilliStartTime(System.currentTimeMillis())
-          .setLocalAddress(LocalHostItem.getLocalAddress(context));
+          .setLocalAddress(LocalHostItemAccess.getLocalAddress(context));
       context.response().endHandler(event ->
           EventManager.post(accessLogEvent.setMilliEndTime(System.currentTimeMillis())));
       context.next();