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

[incubator-servicecomb-service-center] branch master updated: SCB-848 Uses zap to replace the paas-lager (#416)

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

littlecui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new c3a1e76  SCB-848 Uses zap to replace the paas-lager (#416)
c3a1e76 is described below

commit c3a1e76fa21f2d2f8dabaa783fad7a7543de9282
Author: little-cui <su...@qq.com>
AuthorDate: Thu Aug 16 19:47:39 2018 +0800

    SCB-848 Uses zap to replace the paas-lager (#416)
    
    * SCB-848 Uses zap to replace the paas-lager
    
    * SCB-848 Update etcd logger
    
    * SCB-848 Update zap lib LICENSEs
    
    * SCB-848 Resolve the conflicts
---
 .gitignore                                         |   1 +
 glide.yaml                                         |  12 +
 pkg/chain/callback.go                              |   9 +-
 pkg/chain/chain.go                                 |   4 +-
 pkg/chain/handler.go                               |   3 +-
 pkg/etcdsync/mutex.go                              |  18 +-
 pkg/{util => gopool}/goroutines.go                 |  52 ++---
 pkg/{util => gopool}/goroutines_test.go            |  12 +-
 pkg/grace/grace.go                                 |  10 +-
 pkg/log/lager.go                                   | 116 ++++++++++
 pkg/log/log.go                                     | 105 +++++++++
 pkg/log/log_go19.go                                |  46 ++++
 pkg/log/log_go19_test.go                           |  99 +++++++++
 pkg/log/log_test.go                                | 103 +++++++++
 pkg/log/logger.go                                  | 110 +++++++++
 pkg/{util => log}/logrotate.go                     |  43 ++--
 pkg/{util => log}/logrotate_test.go                |   2 +-
 pkg/log/zap.go                                     | 223 +++++++++++++++++++
 pkg/plugin/loader.go                               |  10 +-
 pkg/{util => queue}/uniqueue.go                    |   5 +-
 pkg/{util => queue}/uniqueue_test.go               |   2 +-
 pkg/rest/client.go                                 |  21 +-
 pkg/rest/roa.go                                    |  15 +-
 pkg/rest/route.go                                  |   7 +-
 pkg/rest/server.go                                 |  16 +-
 pkg/task/executor.go                               |  11 +-
 pkg/task/service_async.go                          |  10 +-
 pkg/tlsutil/tlsutil.go                             |  17 +-
 pkg/util/log.go                                    | 245 ---------------------
 pkg/util/log_test.go                               |  84 -------
 pkg/util/reflect.go                                |   6 +-
 pkg/util/sys.go                                    |   1 -
 pkg/util/util.go                                   |  30 ---
 scripts/release/LICENSE                            |  28 +++
 .../release/licenses/LICENSE-natefinch-lumberjack  |  21 ++
 scripts/release/licenses/LICENSE-uber-go-atomic    |  19 ++
 scripts/release/licenses/LICENSE-uber-go-multierr  |  19 ++
 scripts/release/licenses/LICENSE-uber-go-zap       |  19 ++
 server/admin/service.go                            |   3 +-
 server/api.go                                      |  45 ++--
 server/bootstrap/bootstrap.go                      |   4 +-
 server/broker/service.go                           |   3 +-
 server/broker/util.go                              |  28 ++-
 server/core/backend/backend.go                     |   5 +-
 server/core/backend/cacher_kv.go                   |  30 +--
 server/core/backend/cacher_kv_test.go              |   6 +-
 server/core/backend/defer_instance.go              |  16 +-
 server/core/backend/entity_kv.go                   |   4 +-
 server/core/backend/indexer_kv.go                  |   7 +-
 server/core/backend/lease.go                       |   5 +-
 server/core/backend/listwatch_inner.go             |   6 +-
 server/core/backend/store.go                       |  16 +-
 server/core/backend/watcher_inner.go               |   9 +-
 server/core/core.go                                |  31 +--
 server/govern/controller_v4.go                     |   4 +-
 server/govern/service.go                           |  28 +--
 server/handler/auth/auth.go                        |   4 +-
 server/handler/context/v3.go                       |   3 +-
 server/handler/context/v4.go                       |   3 +-
 server/handler/metric/metric.go                    |   4 +-
 server/infra/quota/quota.go                        |  25 ++-
 server/infra/registry/registry.go                  |   8 +-
 server/interceptor/cors/cors.go                    |   4 +-
 server/interceptor/interceptors.go                 |   5 +-
 server/metric/gatherer.go                          |   7 +-
 server/metric/reporter.go                          |   4 +-
 server/plugin/infra/quota/buildin/buildin.go       |   5 +-
 server/plugin/infra/quota/buildin/common.go        |  13 +-
 server/plugin/infra/quota/buildin/common_test.go   |  85 +++++++
 server/plugin/infra/quota/unlimit/unlimit.go       |   4 +-
 server/plugin/infra/registry/buildin/buildin.go    |   4 +-
 .../infra/registry/embededetcd/embededetcd.go      |  34 +--
 server/plugin/infra/registry/etcd/etcd.go          |  54 ++---
 server/plugin/infra/registry/etcd/logger.go        |  56 +++--
 server/plugin/infra/tls/buildin/tls.go             |   9 +-
 server/plugin/infra/tracing/buildin/buildin.go     |   7 +-
 server/plugin/infra/tracing/buildin/common.go      |   6 +-
 .../plugin/infra/tracing/buildin/file_collector.go |  22 +-
 .../infra/tracing/buildin/file_collector_test.go   |   4 +-
 server/plugin/plugin.go                            |   7 +-
 server/rest/controller/v4/dependency_controller.go |  10 +-
 server/rest/controller/v4/instance_controller.go   |  13 +-
 server/rest/controller/v4/instance_watcher.go      |   4 +-
 .../rest/controller/v4/microservice_controller.go  |  14 +-
 server/rest/controller/v4/query_rule_controller.go |  10 +-
 server/rest/controller/v4/schema_controller.go     |  10 +-
 server/rest/controller/v4/tag_controller.go        |   6 +-
 server/rest/server_mux.go                          |   5 +-
 server/rpc/server.go                               |   6 +-
 server/server.go                                   |  28 +--
 server/service/cache/filter_instances.go           |   4 +-
 server/service/cache/filter_permission.go          |   4 +-
 server/service/cache/filter_tags.go                |   3 +-
 server/service/cache/filter_version.go             |   4 +-
 server/service/dependency.go                       |  29 +--
 server/service/event/dependency_event_handler.go   |  21 +-
 server/service/event/instance_event_handler.go     |   9 +-
 server/service/event/rule_event_handler.go         |  11 +-
 server/service/event/service_event_handler.go      |   6 +-
 server/service/event/tag_event_handler.go          |  13 +-
 server/service/instance.go                         | 136 ++++++------
 server/service/microservice.go                     | 134 +++++------
 server/service/notification/listwatcher.go         |  15 +-
 .../notification/notification_healthchecker.go     |   6 +-
 .../service/notification/notification_service.go   |  12 +-
 server/service/notification/notification_test.go   |   4 +-
 server/service/notification/processor.go           |   3 +-
 server/service/notification/processor_test.go      |   4 +-
 server/service/notification/publisher.go           |   8 +-
 server/service/notification/stream.go              |   7 +-
 server/service/notification/websocket.go           |  33 +--
 server/service/rule.go                             |  65 +++---
 server/service/schema.go                           |  99 ++++-----
 server/service/tag.go                              |  47 ++--
 server/service/util/dependency.go                  |  21 +-
 server/service/util/dependency_query.go            |  41 ++--
 server/service/util/dependency_util.go             |  21 +-
 server/service/util/domain_util.go                 |   5 +-
 server/service/util/instance_util.go               |  21 +-
 server/service/util/microservice_util.go           |   5 +-
 server/service/util/rule_util.go                   |  15 +-
 server/service/util/tag_util.go                    |   3 +-
 server/service/validate.go                         |   4 +-
 server/service/watch.go                            |   9 +-
 server/version.go                                  |   4 +-
 125 files changed, 1922 insertions(+), 1191 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8bb0528..e679e2d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@ output
 **/*.coverprofile
 **/coverage.out
 **/coverage.txt
+**/*.log
 
 service-center.iml
 .idea/
diff --git a/glide.yaml b/glide.yaml
index c4dada9..8051f71 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -277,3 +277,15 @@ import:
 - package: github.com/grpc-ecosystem/grpc-gateway
   version: 84398b94e188ee336f307779b57b3aa91af7063c
   repo: https://github.com/grpc-ecosystem/grpc-gateway
+- package: go.uber.org/zap
+  version: 4d45f9617f7d90f7a663ff21c7a4321dbe78098b
+  repo: https://github.com/uber-go/zap
+- package: go.uber.org/atomic
+  version: 1ea20fb1cbb1cc08cbd0d913a96dead89aa18289
+  repo: https://github.com/uber-go/atomic
+- package: go.uber.org/multierr
+  version: 3c4937480c32f4c13a875a1829af76c98ca3d40a
+  repo: https://github.com/uber-go/multierr
+- package: github.com/natefinch/lumberjack
+  version: a96e63847dc3c67d17befa69c303767e2f84e54f
+  repo: https://github.com/natefinch/lumberjack
diff --git a/pkg/chain/callback.go b/pkg/chain/callback.go
index 37e5ef5..e48e16a 100644
--- a/pkg/chain/callback.go
+++ b/pkg/chain/callback.go
@@ -17,11 +17,12 @@
 package chain
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"golang.org/x/net/context"
 )
 
-var pool = util.NewGo(context.Background())
+var pool = gopool.New(context.Background())
 
 type CallbackFunc func(r Result)
 
@@ -54,9 +55,9 @@ func (cb *Callback) Invoke(r Result) {
 }
 
 func (cb *Callback) syncInvoke(r Result) {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	if cb.Func == nil {
-		util.Logger().Errorf(nil, "Callback function is nil. result: %s,", r)
+		log.Errorf(nil, "Callback function is nil. result: %s,", r)
 		return
 	}
 	cb.Func(r)
diff --git a/pkg/chain/chain.go b/pkg/chain/chain.go
index 8cfb4dd..51441fe 100644
--- a/pkg/chain/chain.go
+++ b/pkg/chain/chain.go
@@ -18,7 +18,7 @@ package chain
 
 import (
 	errorsEx "github.com/apache/incubator-servicecomb-service-center/pkg/errors"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 )
 
 type Chain struct {
@@ -43,7 +43,7 @@ func (c *Chain) syncNext(i *Invocation) {
 		if itf == nil {
 			return
 		}
-		util.LogPanic(itf)
+		log.LogPanic(itf)
 
 		i.Fail(errorsEx.RaiseError(itf))
 	}()
diff --git a/pkg/chain/handler.go b/pkg/chain/handler.go
index 5efdab7..bb3ea82 100644
--- a/pkg/chain/handler.go
+++ b/pkg/chain/handler.go
@@ -17,6 +17,7 @@
 package chain
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 )
 
@@ -37,7 +38,7 @@ func RegisterHandler(catalog string, h Handler) {
 	handlersMap[catalog] = handlers
 
 	t := util.Reflect(h)
-	util.Logger().Infof("register handler[%s] %s", catalog, t.Name())
+	log.Infof("register handler[%s] %s", catalog, t.Name())
 }
 
 func Handlers(catalog string) []Handler {
diff --git a/pkg/etcdsync/mutex.go b/pkg/etcdsync/mutex.go
index 81070f8..7c4bd5b 100644
--- a/pkg/etcdsync/mutex.go
+++ b/pkg/etcdsync/mutex.go
@@ -18,6 +18,8 @@ package etcdsync
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
@@ -90,7 +92,7 @@ func (m *DLockFactory) NewDLock(wait bool) (l *DLock, err error) {
 		}
 	}
 	// failed
-	util.Logger().Errorf(err, "Lock key %s failed, id=%s", m.key, l.id)
+	log.Errorf(err, "Lock key %s failed, id=%s", m.key, l.id)
 	l = nil
 
 	if !IsDebug {
@@ -108,7 +110,7 @@ func (m *DLock) Lock(wait bool) (err error) {
 		registry.WithStrKey(m.builder.key),
 		registry.WithStrValue(m.id)}
 
-	util.Logger().Infof("Trying to create a lock: key=%s, id=%s", m.builder.key, m.id)
+	log.Infof("Trying to create a lock: key=%s, id=%s", m.builder.key, m.id)
 
 	var leaseID int64
 	putOpts := opts
@@ -121,7 +123,7 @@ func (m *DLock) Lock(wait bool) (err error) {
 	}
 	success, err := backend.Registry().PutNoOverride(m.builder.ctx, putOpts...)
 	if err == nil && success {
-		util.Logger().Infof("Create Lock OK, key=%s, id=%s", m.builder.key, m.id)
+		log.Infof("Create Lock OK, key=%s, id=%s", m.builder.key, m.id)
 		return nil
 	}
 
@@ -133,10 +135,10 @@ func (m *DLock) Lock(wait bool) (err error) {
 		return fmt.Errorf("Key %s is locked by id=%s", m.builder.key, m.id)
 	}
 
-	util.Logger().Errorf(err, "Key %s is locked, waiting for other node releases it, id=%s, %s", m.builder.key, m.id)
+	log.Errorf(err, "Key %s is locked, waiting for other node releases it, id=%s, %s", m.builder.key, m.id)
 
 	ctx, cancel := context.WithTimeout(m.builder.ctx, time.Duration(m.builder.ttl)*time.Second)
-	util.Go(func(context.Context) {
+	gopool.Go(func(context.Context) {
 		defer cancel()
 		err := backend.Registry().Watch(ctx,
 			registry.WithStrKey(m.builder.key),
@@ -149,7 +151,7 @@ func (m *DLock) Lock(wait bool) (err error) {
 					return nil
 				}))
 		if err != nil {
-			util.Logger().Warnf("%s, key=%s, id=%s", err.Error(), m.builder.key, m.id)
+			log.Warnf("%s, key=%s, id=%s", err.Error(), m.builder.key, m.id)
 		}
 	})
 	select {
@@ -175,10 +177,10 @@ func (m *DLock) Unlock() (err error) {
 	for i := 1; i <= DEFAULT_RETRY_TIMES; i++ {
 		_, err = backend.Registry().Do(m.builder.ctx, opts...)
 		if err == nil {
-			util.Logger().Infof("Delete lock OK, key=%s, id=%s", m.builder.key, m.id)
+			log.Infof("Delete lock OK, key=%s, id=%s", m.builder.key, m.id)
 			return nil
 		}
-		util.Logger().Errorf(err, "Delete lock failed, key=%s, id=%s", m.builder.key, m.id)
+		log.Errorf(err, "Delete lock failed, key=%s, id=%s", m.builder.key, m.id)
 		e, ok := err.(client.Error)
 		if ok && e.Code == client.ErrorCodeKeyNotFound {
 			return nil
diff --git a/pkg/util/goroutines.go b/pkg/gopool/goroutines.go
similarity index 71%
rename from pkg/util/goroutines.go
rename to pkg/gopool/goroutines.go
index 03d3d43..0d01c7b 100644
--- a/pkg/util/goroutines.go
+++ b/pkg/gopool/goroutines.go
@@ -14,51 +14,53 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package util
+package gopool
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"golang.org/x/net/context"
 	"sync"
 	"time"
 )
 
-var GlobalPoolConfig = PoolConfigure()
+var GlobalConfig = Configure()
 
-var defaultGo *GoRoutine
+var defaultGo *Pool
 
 func init() {
-	defaultGo = NewGo(context.Background())
+	defaultGo = New(context.Background())
 }
 
-type PoolConfig struct {
+type Config struct {
 	Concurrent  int
 	IdleTimeout time.Duration
 }
 
-func (c *PoolConfig) Workers(max int) *PoolConfig {
+func (c *Config) Workers(max int) *Config {
 	c.Concurrent = max
 	return c
 }
 
-func (c *PoolConfig) Idle(time time.Duration) *PoolConfig {
+func (c *Config) Idle(time time.Duration) *Config {
 	c.IdleTimeout = time
 	return c
 }
 
-func PoolConfigure() *PoolConfig {
-	return &PoolConfig{
+func Configure() *Config {
+	return &Config{
 		Concurrent:  1000,
 		IdleTimeout: 60 * time.Second,
 	}
 }
 
-type GoRoutine struct {
-	Cfg *PoolConfig
+type Pool struct {
+	Cfg *Config
 
 	// job context
 	ctx    context.Context
 	cancel context.CancelFunc
-	// pending is the chan to block GoRoutine.Do() when go pool is full
+	// pending is the chan to block Pool.Do() when go pool is full
 	pending chan func(ctx context.Context)
 	// workers is the counter of the worker
 	workers chan struct{}
@@ -68,13 +70,13 @@ type GoRoutine struct {
 	closed bool
 }
 
-func (g *GoRoutine) execute(f func(ctx context.Context)) {
-	defer RecoverAndReport()
+func (g *Pool) execute(f func(ctx context.Context)) {
+	defer log.Recover()
 	f(g.ctx)
 }
 
-func (g *GoRoutine) Do(f func(context.Context)) *GoRoutine {
-	defer RecoverAndReport()
+func (g *Pool) Do(f func(context.Context)) *Pool {
+	defer log.Recover()
 	select {
 	case g.pending <- f:
 	case g.workers <- struct{}{}:
@@ -84,7 +86,7 @@ func (g *GoRoutine) Do(f func(context.Context)) *GoRoutine {
 	return g
 }
 
-func (g *GoRoutine) loop(f func(context.Context)) {
+func (g *Pool) loop(f func(context.Context)) {
 	defer g.wg.Done()
 	defer func() { <-g.workers }()
 
@@ -100,13 +102,13 @@ func (g *GoRoutine) loop(f func(context.Context)) {
 			if f == nil {
 				return
 			}
-			ResetTimer(timer, g.Cfg.IdleTimeout)
+			util.ResetTimer(timer, g.Cfg.IdleTimeout)
 		}
 	}
 }
 
 // Close will call context.Cancel(), so all goroutines maybe exit when job does not complete
-func (g *GoRoutine) Close(grace bool) {
+func (g *Pool) Close(grace bool) {
 	g.mux.Lock()
 	if g.closed {
 		g.mux.Unlock()
@@ -124,7 +126,7 @@ func (g *GoRoutine) Close(grace bool) {
 }
 
 // Done will wait for all goroutines complete the jobs and then close the pool
-func (g *GoRoutine) Done() {
+func (g *Pool) Done() {
 	g.mux.Lock()
 	if g.closed {
 		g.mux.Unlock()
@@ -138,13 +140,13 @@ func (g *GoRoutine) Done() {
 	g.wg.Wait()
 }
 
-func NewGo(ctx context.Context, cfgs ...*PoolConfig) *GoRoutine {
+func New(ctx context.Context, cfgs ...*Config) *Pool {
 	ctx, cancel := context.WithCancel(ctx)
 	if len(cfgs) == 0 {
-		cfgs = append(cfgs, GlobalPoolConfig)
+		cfgs = append(cfgs, GlobalConfig)
 	}
 	cfg := cfgs[0]
-	gr := &GoRoutine{
+	gr := &Pool{
 		Cfg:     cfg,
 		ctx:     ctx,
 		cancel:  cancel,
@@ -158,7 +160,7 @@ func Go(f func(context.Context)) {
 	defaultGo.Do(f)
 }
 
-func GoCloseAndWait() {
+func CloseAndWait() {
 	defaultGo.Close(true)
-	Logger().Debugf("all goroutines exited")
+	log.Debugf("all goroutines exited")
 }
diff --git a/pkg/util/goroutines_test.go b/pkg/gopool/goroutines_test.go
similarity index 92%
rename from pkg/util/goroutines_test.go
rename to pkg/gopool/goroutines_test.go
index 997ca95..bfdb4e7 100644
--- a/pkg/util/goroutines_test.go
+++ b/pkg/gopool/goroutines_test.go
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package util
+package gopool
 
 import (
 	"fmt"
@@ -25,7 +25,7 @@ import (
 )
 
 func TestGoRoutine_Do(t *testing.T) {
-	test1 := NewGo(context.Background())
+	test1 := New(context.Background())
 	defer test1.Close(true)
 	stopCh1 := make(chan struct{})
 	test1.Do(func(ctx context.Context) {
@@ -39,7 +39,7 @@ func TestGoRoutine_Do(t *testing.T) {
 	<-stopCh1
 
 	ctx, cancel := context.WithCancel(context.Background())
-	test2 := NewGo(ctx)
+	test2 := New(ctx)
 	defer test2.Close(true)
 	stopCh2 := make(chan struct{})
 	test2.Do(func(ctx context.Context) {
@@ -58,7 +58,7 @@ func TestGoRoutine_Wait(t *testing.T) {
 	var mux sync.Mutex
 	MAX := 10
 	resultArr := make([]int, 0, MAX)
-	test := NewGo(context.Background(), PoolConfigure().Idle(time.Second).Workers(5))
+	test := New(context.Background(), Configure().Idle(time.Second).Workers(5))
 	for i := 0; i < MAX; i++ {
 		test.Do(func(ctx context.Context) {
 			select {
@@ -81,7 +81,7 @@ func TestGoRoutine_Wait(t *testing.T) {
 }
 
 func TestGoRoutine_Exception1(t *testing.T) {
-	test := NewGo(context.Background())
+	test := New(context.Background())
 	test.Do(func(ctx context.Context) {
 		select {
 		case <-ctx.Done():
@@ -114,5 +114,5 @@ func TestGoRoutine_Exception2(t *testing.T) {
 		var a *int
 		fmt.Println(*a)
 	})
-	GoCloseAndWait()
+	CloseAndWait()
 }
diff --git a/pkg/grace/grace.go b/pkg/grace/grace.go
index 2d18855..46b3ef2 100644
--- a/pkg/grace/grace.go
+++ b/pkg/grace/grace.go
@@ -19,7 +19,7 @@ package grace
 import (
 	"flag"
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"os"
 	"os/exec"
 	"os/signal"
@@ -123,10 +123,10 @@ func handleSignals() {
 			fireSignalHook(PreSignal, sig)
 			switch sig {
 			case syscall.SIGHUP:
-				util.Logger().Debugf("received signal '%v', now forking", sig)
+				log.Debugf("received signal '%v', now forking", sig)
 				err := fork()
 				if err != nil {
-					util.Logger().Errorf(err, "fork a process failed")
+					log.Errorf(err, "fork a process failed")
 				}
 			}
 			fireSignalHook(PostSignal, sig)
@@ -154,10 +154,10 @@ func fork() (err error) {
 	}
 
 	if err = newCommand(args...); err != nil {
-		util.Logger().Errorf(err, "fork a process failed, %v", args)
+		log.Errorf(err, "fork a process failed, %v", args)
 		return
 	}
-	util.Logger().Warnf("fork process %v", args)
+	log.Warnf("fork process %v", args)
 	return
 }
 
diff --git a/pkg/log/lager.go b/pkg/log/lager.go
new file mode 100644
index 0000000..2d88a07
--- /dev/null
+++ b/pkg/log/lager.go
@@ -0,0 +1,116 @@
+// 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.
+
+// +build !go1.9
+
+package log
+
+import (
+	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	stlager "github.com/go-chassis/paas-lager"
+	"github.com/go-chassis/paas-lager/third_party/forked/cloudfoundry/lager"
+	"os"
+	"runtime/debug"
+	"time"
+)
+
+const loggerCallerSkip = 1
+
+var (
+	defaultLagerConfig = stlager.DefaultConfig()
+	stdOutWriters      = []string{"stdout"}
+	fileWriters        = []string{"file"}
+)
+
+// Config struct for lager and rotate parameters
+type Config struct {
+	LoggerLevel   string
+	LoggerFile    string
+	LogFormatText bool
+	// MB
+	LogRotateSize  int
+	LogBackupCount int
+	CallerSkip     int
+}
+
+func (c Config) WithCallerSkip(s int) Config {
+	c.CallerSkip = s
+	return c
+}
+
+func (c Config) WithFile(path string) Config {
+	c.LoggerFile = path
+	return c
+}
+
+func Configure() Config {
+	return fromLagerConfig(defaultLagerConfig)
+}
+
+func fromLagerConfig(c *stlager.Config) Config {
+	return Config{
+		LoggerLevel:   c.LoggerLevel,
+		LoggerFile:    c.LoggerFile,
+		LogFormatText: c.LogFormatText,
+	}
+}
+
+func toLagerConfig(c Config) stlager.Config {
+	w := fileWriters
+	if len(c.LoggerFile) == 0 {
+		w = stdOutWriters
+	}
+	return stlager.Config{
+		Writers:       w,
+		LoggerLevel:   c.LoggerLevel,
+		LoggerFile:    c.LoggerFile,
+		LogFormatText: c.LogFormatText,
+	}
+}
+
+// newLog new log, unsafe
+func NewLogger(cfg Config) *Logger {
+	if cfg.CallerSkip == 0 {
+		cfg.CallerSkip = loggerCallerSkip
+	}
+	stlager.Init(toLagerConfig(cfg))
+	return &Logger{
+		Config: cfg,
+		Logger: stlager.NewLogger(cfg.LoggerFile),
+	}
+}
+
+type Logger struct {
+	Config Config
+	lager.Logger
+}
+
+func (l *Logger) Recover(r interface{}, callerSkip int) {
+	file, method, line, ok := util.GetCaller(callerSkip + l.Config.CallerSkip)
+	if ok {
+		l.Errorf(nil, "recover from %s %s():%d! %v", util.FileLastName(file), method, line, r)
+		return
+	}
+
+	file, method, line, _ = util.GetCaller(0)
+	fmt.Fprintf(os.Stderr, "%s %s %s %d %s %s():%d %v\n",
+		time.Now().Format("2006-01-02T15:04:05.000Z07:00"), "FATAL", "system", os.Getpid(),
+		util.FileLastName(file), method, line, r)
+	fmt.Fprintln(os.Stderr, util.BytesToStringWithNoCopy(debug.Stack()))
+}
+
+func (l *Logger) Sync() {
+}
diff --git a/pkg/log/log.go b/pkg/log/log.go
new file mode 100644
index 0000000..aac012d
--- /dev/null
+++ b/pkg/log/log.go
@@ -0,0 +1,105 @@
+// 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.
+
+// +build !go1.9
+
+package log
+
+import (
+	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/go-chassis/paas-lager/third_party/forked/cloudfoundry/lager"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+const (
+	defaultLogLevel        = "DEBUG"
+	globalCallerSkip       = 2
+	defaultLogRotatePeriod = 30 * time.Second
+)
+
+//log var
+var (
+	logger         = NewLogger(Configure().WithCallerSkip(globalCallerSkip))
+	globalConfig   Config
+	globalLogLevel lager.LogLevel
+)
+
+func SetGlobal(cfg Config) {
+	// renew the global logger
+	if len(cfg.LoggerLevel) == 0 {
+		cfg.LoggerLevel = defaultLogLevel
+	}
+	globalConfig = cfg
+	logger = NewLogger(cfg)
+	// recreate the deleted log file
+	switch strings.ToUpper(cfg.LoggerLevel) {
+	case "INFO":
+		globalLogLevel = lager.INFO
+	case "WARN":
+		globalLogLevel = lager.WARN
+	case "ERROR":
+		globalLogLevel = lager.ERROR
+	case "FATAL":
+		globalLogLevel = lager.FATAL
+	default:
+		globalLogLevel = lager.DEBUG
+	}
+
+	runLogDirRotate(cfg)
+
+	monitorLogFile()
+}
+
+func runLogDirRotate(cfg Config) {
+	if len(cfg.LoggerFile) == 0 {
+		return
+	}
+	go func() {
+		for {
+			<-time.After(defaultLogRotatePeriod)
+			LogRotate(filepath.Dir(cfg.LoggerFile), cfg.LogRotateSize, cfg.LogBackupCount)
+		}
+	}()
+}
+
+func monitorLogFile() {
+	if len(globalConfig.LoggerFile) == 0 {
+		return
+	}
+	go func() {
+		for {
+			<-time.After(time.Minute)
+			Debug(fmt.Sprintf("Check log file at %s", time.Now()))
+			if util.PathExist(globalConfig.LoggerFile) {
+				continue
+			}
+
+			file, err := os.OpenFile(globalConfig.LoggerFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
+			if err != nil {
+				Errorf(err, "Create log file failed.")
+				continue
+			}
+
+			// TODO Here will lead to file handle leak
+			sink := lager.NewReconfigurableSink(lager.NewWriterSink("file", file, lager.DEBUG), globalLogLevel)
+			logger.RegisterSink(sink)
+			Errorf(nil, "log file is removed, create again.")
+		}
+	}()
+}
diff --git a/pkg/log/log_go19.go b/pkg/log/log_go19.go
new file mode 100644
index 0000000..1ff5772
--- /dev/null
+++ b/pkg/log/log_go19.go
@@ -0,0 +1,46 @@
+// 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.
+
+// +build go1.9
+
+package log
+
+import (
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
+)
+
+const globalCallerSkip = 2
+
+var (
+	logger = NewLogger(Configure().WithCallerSkip(globalCallerSkip))
+
+	zapLevelMap = map[string]zapcore.Level{
+		"DEBUG": zap.DebugLevel,
+		"INFO":  zap.InfoLevel,
+		"WARN":  zap.WarnLevel,
+		"ERROR": zap.ErrorLevel,
+		"FATAL": zap.FatalLevel,
+	}
+)
+
+func SetGlobal(cfg Config) {
+	logger = NewLogger(cfg.WithCallerSkip(globalCallerSkip))
+
+	// zap internal log
+	_ = zap.ReplaceGlobals(logger.zapLogger)
+	// golang log
+	_ = zap.RedirectStdLog(logger.zapLogger)
+}
diff --git a/pkg/log/log_go19_test.go b/pkg/log/log_go19_test.go
new file mode 100644
index 0000000..5b15281
--- /dev/null
+++ b/pkg/log/log_go19_test.go
@@ -0,0 +1,99 @@
+// 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.
+
+// +build go1.9
+
+package log
+
+import (
+	"errors"
+	"os"
+	"testing"
+	"time"
+)
+
+func TestNewLogger(t *testing.T) {
+	l := NewLogger(Configure())
+	defer func() {
+		r := recover()
+		LogPanic(r)
+		l.Recover(r, 3)
+		defer func() {
+			l.Recover(recover(), 3)
+
+			defer func() {
+				l.Recover(recover(), 3)
+
+				defer Recover()
+				Fatalf(nil, "a")
+			}()
+			Fatal("a", nil)
+		}()
+		l.Fatalf(nil, "%s", "b")
+	}()
+
+	os.Remove("test.log")
+	SetGlobal(Configure().WithCallerSkip(2).WithFile("test.log"))
+
+	Debug("a")
+	l.Debug("a")
+	Debugf("%s", "b")
+	l.Debugf("%s", "b")
+
+	Info("a")
+	l.Info("a")
+	Infof("%s", "b")
+	l.Infof("%s", "b")
+
+	Warn("a")
+	l.Warn("a")
+	Warnf("%s", "b")
+	l.Warnf("%s", "b")
+
+	Error("a", nil)
+	l.Error("a", nil)
+	Errorf(nil, "%s", "a")
+	l.Errorf(nil, "%s", "a")
+	Error("a", errors.New("error"))
+	l.Error("a", errors.New("error"))
+	Errorf(errors.New("error"), "%s", "a")
+	l.Errorf(errors.New("error"), "%s", "a")
+
+	Sync()
+	l.Sync()
+
+	LogNilOrWarnf(time.Now(), "a")
+	LogNilOrWarnf(time.Now().Add(-time.Second), "a")
+	LogDebugOrWarnf(time.Now(), "a")
+	LogDebugOrWarnf(time.Now().Add(-time.Second), "a")
+	LogInfoOrWarnf(time.Now(), "a")
+	LogInfoOrWarnf(time.Now().Add(-time.Second), "a")
+
+	l.Fatal("a", nil)
+}
+
+func BenchmarkZapLogger(b *testing.B) {
+	cfg := Configure().WithFile("test.log")
+	l := NewLogger(cfg)
+	defer os.Remove("test.log")
+
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		l.Infof("error test %s", "x")
+	}
+	l.Sync()
+	// 300000	      6078 ns/op	     176 B/op	       7 allocs/op
+	b.ReportAllocs()
+}
diff --git a/pkg/log/log_test.go b/pkg/log/log_test.go
new file mode 100644
index 0000000..198d0b3
--- /dev/null
+++ b/pkg/log/log_test.go
@@ -0,0 +1,103 @@
+// 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.
+
+// +build !go1.9
+
+package log
+
+import (
+	"errors"
+	"os"
+	"testing"
+	"time"
+)
+
+func TestNewLogger(t *testing.T) {
+	l := NewLogger(Configure())
+	defer func() {
+		r := recover()
+		LogPanic(r)
+		l.Recover(r, 3)
+		defer func() {
+			l.Recover(recover(), 3)
+
+			defer func() {
+				l.Recover(recover(), 3)
+
+				defer Recover()
+				Fatalf(nil, "a")
+			}()
+			Fatal("a", nil)
+		}()
+		l.Fatalf(nil, "%s", "b")
+	}()
+
+	os.Remove("test.log")
+	SetGlobal(Config{
+		LoggerFile:     "test.log",
+		LogFormatText:  true,
+		LogRotateSize:  1,
+		LogBackupCount: 1,
+		CallerSkip:     2,
+	})
+
+	Debug("a")
+	l.Debug("a")
+	Debugf("%s", "b")
+	l.Debugf("%s", "b")
+
+	Info("a")
+	l.Info("a")
+	Infof("%s", "b")
+	l.Infof("%s", "b")
+
+	Warn("a")
+	l.Warn("a")
+	Warnf("%s", "b")
+	l.Warnf("%s", "b")
+
+	Error("a", nil)
+	l.Error("a", nil)
+	Errorf(nil, "%s", "a")
+	l.Errorf(nil, "%s", "a")
+	Error("a", errors.New("error"))
+	l.Error("a", errors.New("error"))
+	Errorf(errors.New("error"), "%s", "a")
+	l.Errorf(errors.New("error"), "%s", "a")
+
+	Sync()
+	l.Sync()
+
+	LogNilOrWarnf(time.Now(), "a")
+	LogNilOrWarnf(time.Now().Add(-time.Second), "a")
+	LogDebugOrWarnf(time.Now(), "a")
+	LogDebugOrWarnf(time.Now().Add(-time.Second), "a")
+	LogInfoOrWarnf(time.Now(), "a")
+	LogInfoOrWarnf(time.Now().Add(-time.Second), "a")
+
+	l.Fatal("a", nil)
+}
+
+func BenchmarkLagerLogger(b *testing.B) {
+	cfg := Configure().WithFile("test.log")
+	l := NewLogger(cfg)
+	defer os.Remove("test.log")
+
+	for i := 0; i < b.N; i++ {
+		l.Infof("error test")
+	}
+	// 200000	      8217 ns/op	     912 B/op	      15 allocs/op
+	b.ReportAllocs()
+}
diff --git a/pkg/log/logger.go b/pkg/log/logger.go
new file mode 100644
index 0000000..1ba8fc6
--- /dev/null
+++ b/pkg/log/logger.go
@@ -0,0 +1,110 @@
+/*
+ * 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 log
+
+import (
+	"fmt"
+	"time"
+)
+
+func Default() *Logger {
+	return logger
+}
+
+func Debug(msg string) {
+	logger.Debug(msg)
+}
+
+func Debugf(format string, args ...interface{}) {
+	logger.Debugf(format, args...)
+}
+
+func Info(msg string) {
+	logger.Info(msg)
+}
+
+func Infof(format string, args ...interface{}) {
+	logger.Infof(format, args...)
+}
+
+func Warn(msg string) {
+	logger.Warn(msg)
+}
+
+func Warnf(format string, args ...interface{}) {
+	logger.Warnf(format, args...)
+}
+
+func Error(msg string, err error) {
+	logger.Error(msg, err)
+}
+
+func Errorf(err error, format string, args ...interface{}) {
+	logger.Errorf(err, format, args...)
+}
+
+func Fatal(msg string, err error) {
+	logger.Fatal(msg, err)
+}
+
+func Fatalf(err error, format string, args ...interface{}) {
+	logger.Fatalf(err, format, args...)
+}
+
+func Sync() {
+	logger.Sync()
+}
+
+func LogNilOrWarnf(start time.Time, format string, args ...interface{}) {
+	cost := time.Now().Sub(start)
+	if cost < time.Second {
+		return
+	}
+	logger.Warnf("[%s]%s", cost, fmt.Sprintf(format, args...))
+}
+
+func LogDebugOrWarnf(start time.Time, format string, args ...interface{}) {
+	cost := time.Now().Sub(start)
+	if cost < time.Second {
+		logger.Debugf("[%s]%s", cost, fmt.Sprintf(format, args...))
+		return
+	}
+	logger.Warnf("[%s]%s", cost, fmt.Sprintf(format, args...))
+}
+
+func LogInfoOrWarnf(start time.Time, format string, args ...interface{}) {
+	cost := time.Now().Sub(start)
+	if cost < time.Second {
+		logger.Infof("[%s]%s", cost, fmt.Sprintf(format, args...))
+		return
+	}
+	logger.Warnf("[%s]%s", cost, fmt.Sprintf(format, args...))
+}
+
+// LogPanic is a function can only be called in defer function.
+func LogPanic(r interface{}) {
+	logger.Recover(r, 3) // LogPanic()<-defer()<-panic()<-final caller
+}
+
+// Recover is a function call recover() and print the stack in log
+// Please call this function like 'defer log.Recover()' in your code
+func Recover() {
+	if r := recover(); r != nil {
+		LogPanic(r)
+	}
+	return
+}
diff --git a/pkg/util/logrotate.go b/pkg/log/logrotate.go
similarity index 86%
rename from pkg/util/logrotate.go
rename to pkg/log/logrotate.go
index 138677d..3bc9571 100644
--- a/pkg/util/logrotate.go
+++ b/pkg/log/logrotate.go
@@ -14,12 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package util
+package log
 
 import (
 	"archive/zip"
 	"fmt"
-	"golang.org/x/net/context"
 	"io"
 	"os"
 	"path/filepath"
@@ -68,7 +67,7 @@ func removeExceededFiles(path string, baseFileName string,
 	}
 	fileList, err := FilterFileList(path, pat, 0777)
 	if err != nil {
-		Logger().Error("filepath.Walk() "+EscapPath(path)+" failed", err)
+		Error("filepath.Walk() "+EscapPath(path)+" failed", err)
 		return
 	}
 	sort.Strings(fileList)
@@ -78,10 +77,10 @@ func removeExceededFiles(path string, baseFileName string,
 	//remove exceeded files, keep file count below maxBackupCount
 	for len(fileList) > maxKeptCount {
 		filePath := fileList[0]
-		Logger().Warn("remove "+EscapPath(filePath), nil)
+		Warn("remove " + EscapPath(filePath))
 		err := removeFile(filePath)
 		if err != nil {
-			Logger().Error("remove "+EscapPath(filePath)+" failed", err)
+			Error("remove "+EscapPath(filePath)+" failed", err)
 			break
 		}
 		//remove the first element of a list
@@ -136,7 +135,7 @@ func shouldRollover(fPath string, MaxFileSize int) bool {
 
 	fileInfo, err := os.Stat(fPath)
 	if err != nil {
-		Logger().Error("state "+EscapPath(fPath)+" failed", err)
+		Error("state "+EscapPath(fPath)+" failed", err)
 		return false
 	}
 
@@ -156,13 +155,13 @@ func doRollover(fPath string, MaxFileSize int, MaxBackupCount int) {
 	rotateFile := fPath + "." + timeStamp
 	err := CopyFile(fPath, rotateFile)
 	if err != nil {
-		Logger().Error("copy "+EscapPath(fPath)+" failed", err)
+		Error("copy "+EscapPath(fPath)+" failed", err)
 	}
 
 	//truncate the file
 	f, err := os.OpenFile(fPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
 	if err != nil {
-		Logger().Error("truncate "+EscapPath(fPath)+" failed", err)
+		Error("truncate "+EscapPath(fPath)+" failed", err)
 		return
 	}
 	f.Close()
@@ -178,7 +177,7 @@ func doBackup(fPath string, MaxBackupCount int) {
 	pat := fmt.Sprintf(`%s\.[0-9]{1,17}$`, filepath.Base(fPath))
 	rotateFileList, err := FilterFileList(filepath.Dir(fPath), pat, 0777)
 	if err != nil {
-		Logger().Error("walk"+EscapPath(fPath)+" failed", err)
+		Error("walk"+EscapPath(fPath)+" failed", err)
 		return
 	}
 
@@ -193,12 +192,12 @@ func doBackup(fPath string, MaxBackupCount int) {
 			err = compressFile(file, filepath.Base(fPath), true)
 		}
 		if err != nil {
-			Logger().Error("compress"+EscapPath(file)+" failed", err)
+			Error("compress"+EscapPath(file)+" failed", err)
 			continue
 		}
 		err = removeFile(file)
 		if err != nil {
-			Logger().Error("remove"+EscapPath(file)+" failed", err)
+			Error("remove"+EscapPath(file)+" failed", err)
 		}
 	}
 
@@ -209,7 +208,7 @@ func doBackup(fPath string, MaxBackupCount int) {
 func LogRotateFile(file string, MaxFileSize int, MaxBackupCount int) {
 	defer func() {
 		if e := recover(); e != nil {
-			Logger().Errorf(nil, "LogRotate file %s catch an exception, err: %v.", EscapPath(file), e)
+			Errorf(nil, "LogRotate file %s catch an exception, err: %v.", EscapPath(file), e)
 		}
 	}()
 
@@ -224,14 +223,14 @@ func LogRotate(path string, MaxFileSize int, MaxBackupCount int) {
 	//filter .log .trace files
 	defer func() {
 		if e := recover(); e != nil {
-			Logger().Errorf(nil, "LogRotate catch an exception, err: %v.", e)
+			Errorf(nil, "LogRotate catch an exception, err: %v.", e)
 		}
 	}()
 
 	pat := `.(\.log|\.trace|\.out)$`
 	fileList, err := FilterFileList(path, pat, 0200)
 	if err != nil {
-		Logger().Error("filepath.Walk() "+EscapPath(path)+" failed", err)
+		Error("filepath.Walk() "+EscapPath(path)+" failed", err)
 		return
 	}
 
@@ -294,22 +293,6 @@ func CopyFile(srcFile, destFile string) error {
 	return err
 }
 
-func RunLogDirRotate(cfg LoggerConfig) {
-	if len(cfg.LoggerFile) == 0 {
-		return
-	}
-	Go(func(ctx context.Context) {
-		for {
-			select {
-			case <-ctx.Done():
-				return
-			case <-time.After(cfg.LogRotatePeriod):
-				LogRotate(filepath.Dir(cfg.LoggerFile), cfg.LogRotateSize, cfg.LogBackupCount)
-			}
-		}
-	})
-}
-
 func init() {
 	var s []string
 	if e := os.Getenv("INSTALL_ROOT"); len(e) > 0 {
diff --git a/pkg/util/logrotate_test.go b/pkg/log/logrotate_test.go
similarity index 99%
rename from pkg/util/logrotate_test.go
rename to pkg/log/logrotate_test.go
index 4ffad2f..312e518 100644
--- a/pkg/util/logrotate_test.go
+++ b/pkg/log/logrotate_test.go
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package util
+package log
 
 import (
 	"os"
diff --git a/pkg/log/zap.go b/pkg/log/zap.go
new file mode 100644
index 0000000..8f42c9e
--- /dev/null
+++ b/pkg/log/zap.go
@@ -0,0 +1,223 @@
+// 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.
+
+// +build go1.9
+
+package log
+
+import (
+	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/natefinch/lumberjack"
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
+	"os"
+	"runtime"
+	"runtime/debug"
+	"strings"
+	"time"
+)
+
+const (
+	defaultLogLevel  = "DEBUG"
+	loggerCallerSkip = 1
+)
+
+var (
+	StdoutSyncer = zapcore.AddSync(os.Stdout)
+	StderrSyncer = zapcore.AddSync(os.Stderr)
+)
+
+// Config struct for lager and rotate parameters
+type Config struct {
+	LoggerLevel string
+	LoggerFile  string
+	// if false, log print with JSON format
+	LogFormatText bool
+	// M Bytes
+	LogRotateSize  int
+	LogBackupCount int
+	// days
+	LogBackupAge int
+	CallerSkip   int
+}
+
+func (cfg Config) WithCallerSkip(s int) Config {
+	cfg.CallerSkip = s
+	return cfg
+}
+
+func (cfg Config) WithFile(path string) Config {
+	cfg.LoggerFile = path
+	return cfg
+}
+
+func Configure() Config {
+	return Config{
+		LoggerLevel:   defaultLogLevel,
+		LogFormatText: true,
+		CallerSkip:    loggerCallerSkip,
+	}
+}
+
+func toZapConfig(c Config) zapcore.Core {
+	// level config
+	l, ok := zapLevelMap[strings.ToUpper(c.LoggerLevel)]
+	if !ok {
+		l = zap.DebugLevel
+	}
+	var levelEnabler zap.LevelEnablerFunc = func(level zapcore.Level) bool {
+		return level >= l
+	}
+
+	// log format
+	format := zapcore.EncoderConfig{
+		MessageKey:     "message",
+		LevelKey:       "level",
+		TimeKey:        "time",
+		NameKey:        "logger",
+		CallerKey:      "caller",
+		StacktraceKey:  "stack",
+		LineEnding:     zapcore.DefaultLineEnding,
+		EncodeLevel:    zapcore.CapitalLevelEncoder,
+		EncodeTime:     zapcore.ISO8601TimeEncoder,
+		EncodeDuration: zapcore.StringDurationEncoder,
+		EncodeCaller:   zapcore.ShortCallerEncoder,
+		EncodeName:     zapcore.FullNameEncoder,
+	}
+	var enc zapcore.Encoder
+	if c.LogFormatText {
+		enc = zapcore.NewConsoleEncoder(format)
+	} else {
+		enc = zapcore.NewJSONEncoder(format)
+	}
+
+	// log rotate
+	var syncer zapcore.WriteSyncer
+	if len(c.LoggerFile) > 0 {
+		syncer = zapcore.AddSync(&lumberjack.Logger{
+			Filename:   c.LoggerFile,
+			MaxSize:    c.LogRotateSize,
+			MaxBackups: c.LogBackupCount,
+			MaxAge:     c.LogBackupAge,
+			LocalTime:  false,
+			Compress:   true,
+		})
+	} else {
+		syncer = StdoutSyncer
+	}
+
+	zap.NewDevelopment()
+	return zapcore.NewCore(enc, syncer, levelEnabler)
+}
+
+type Logger struct {
+	Config Config
+
+	zapLogger *zap.Logger
+	zapSugar  *zap.SugaredLogger
+}
+
+func (l *Logger) Debug(msg string) {
+	l.zapLogger.Debug(msg)
+}
+
+func (l *Logger) Debugf(format string, args ...interface{}) {
+	l.zapSugar.Debugf(format, args...)
+}
+
+func (l *Logger) Info(msg string) {
+	l.zapLogger.Info(msg)
+}
+
+func (l *Logger) Infof(format string, args ...interface{}) {
+	l.zapSugar.Infof(format, args...)
+}
+
+func (l *Logger) Warn(msg string) {
+	l.zapLogger.Warn(msg)
+}
+
+func (l *Logger) Warnf(format string, args ...interface{}) {
+	l.zapSugar.Warnf(format, args...)
+}
+
+func (l *Logger) Error(msg string, err error) {
+	if err == nil {
+		l.zapLogger.Error(msg)
+		return
+	}
+	l.zapLogger.Error(msg, zap.String("error", err.Error()))
+}
+
+func (l *Logger) Errorf(err error, format string, args ...interface{}) {
+	if err == nil {
+		l.zapSugar.Errorf(format, args...)
+		return
+	}
+	l.zapSugar.With("error", err.Error()).Errorf(format, args...)
+}
+
+func (l *Logger) Fatal(msg string, err error) {
+	if err == nil {
+		l.zapLogger.Panic(msg)
+		return
+	}
+	l.zapLogger.Panic(msg, zap.String("error", err.Error()))
+}
+
+func (l *Logger) Fatalf(err error, format string, args ...interface{}) {
+	if err == nil {
+		l.zapSugar.Panicf(format, args...)
+		return
+	}
+	l.zapSugar.With("error", err.Error()).Panicf(format, args...)
+}
+
+// callSkip equals to 0 identify the caller of Recover()
+func (l *Logger) Recover(r interface{}, callerSkip int) {
+	e := zapcore.Entry{
+		Level:  zap.PanicLevel, // zapcore sync automatically when larger than ErrorLevel
+		Time:   time.Now(),
+		Caller: zapcore.NewEntryCaller(runtime.Caller(callerSkip + l.Config.CallerSkip)),
+		Stack:  zap.Stack("stack").String,
+	}
+	if err := l.zapLogger.Core().With([]zap.Field{zap.Reflect("recover", r)}).Write(e, nil); err != nil {
+		file, _, line, _ := util.GetCaller(0)
+		fmt.Fprintf(StderrSyncer, "%s\tERROR\t%s:%d\t%v\n",
+			time.Now().Format("2006-01-02T15:04:05.000Z0700"),
+			util.FileLastName(file), line, err)
+		fmt.Fprintln(StderrSyncer, util.BytesToStringWithNoCopy(debug.Stack()))
+		StderrSyncer.Sync()
+		return
+	}
+}
+
+func (l *Logger) Sync() {
+	l.zapLogger.Sync()
+}
+
+func NewLogger(cfg Config) *Logger {
+	l := zap.New(toZapConfig(cfg),
+		zap.ErrorOutput(StderrSyncer),
+		zap.AddCaller(),
+		zap.AddCallerSkip(cfg.CallerSkip),
+	)
+	return &Logger{
+		Config:    cfg,
+		zapLogger: l,
+		zapSugar:  l.Sugar(),
+	}
+}
diff --git a/pkg/plugin/loader.go b/pkg/plugin/loader.go
index f5a3bba..493f46d 100644
--- a/pkg/plugin/loader.go
+++ b/pkg/plugin/loader.go
@@ -18,7 +18,7 @@ package plugin
 
 import (
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -49,7 +49,7 @@ func (pm *Loader) Init() {
 
 	err := pm.ReloadPlugins()
 	if len(pm.Plugins) == 0 {
-		util.Logger().Errorf(err, "no any plugin has been loaded.")
+		log.Errorf(err, "no any plugin has been loaded")
 	}
 }
 
@@ -59,7 +59,7 @@ func (pm *Loader) ReloadPlugins() error {
 		dir, _ = os.Getwd()
 	}
 	if len(dir) == 0 {
-		return fmt.Errorf("'plugins_dir' is unset.")
+		return fmt.Errorf("'plugins_dir' is unset")
 	}
 
 	files, err := ioutil.ReadDir(dir)
@@ -83,7 +83,7 @@ func (pm *Loader) ReloadPlugins() error {
 		if err != nil {
 			return fmt.Errorf("load plugin '%s' error for %s", submatchs[1], err.Error())
 		}
-		util.Logger().Infof("load plugin '%s' successfully.", submatchs[1])
+		log.Infof("load plugin '%s' successfully", submatchs[1])
 
 		pm.mux.Lock()
 		pm.Plugins[submatchs[1]] = &wrapPlugin{p, make(map[string]plugin.Symbol, 10)}
@@ -97,7 +97,7 @@ func (pm *Loader) Find(pluginName, funcName string) (plugin.Symbol, error) {
 	w, ok := pm.Plugins[pluginName]
 	if !ok {
 		pm.mux.RUnlock()
-		return nil, fmt.Errorf("can not find plugin '%s'.", pluginName)
+		return nil, fmt.Errorf("can not find plugin '%s'", pluginName)
 	}
 
 	f, ok := w.funcs[funcName]
diff --git a/pkg/util/uniqueue.go b/pkg/queue/uniqueue.go
similarity index 94%
rename from pkg/util/uniqueue.go
rename to pkg/queue/uniqueue.go
index e4b2c4f..aa68380 100644
--- a/pkg/util/uniqueue.go
+++ b/pkg/queue/uniqueue.go
@@ -14,10 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package util
+package queue
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"golang.org/x/net/context"
 )
 
@@ -41,7 +42,7 @@ func (uq *UniQueue) Chan() <-chan interface{} {
 func (uq *UniQueue) Put(value interface{}) (e error) {
 	defer func() {
 		if r := recover(); r != nil {
-			LogPanic(r)
+			log.LogPanic(r)
 
 			e = fmt.Errorf("%v", r)
 		}
diff --git a/pkg/util/uniqueue_test.go b/pkg/queue/uniqueue_test.go
similarity index 99%
rename from pkg/util/uniqueue_test.go
rename to pkg/queue/uniqueue_test.go
index 9bafcfa..c4413d2 100644
--- a/pkg/util/uniqueue_test.go
+++ b/pkg/queue/uniqueue_test.go
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package util
+package queue
 
 import (
 	"fmt"
diff --git a/pkg/rest/client.go b/pkg/rest/client.go
index 56f7423..e443a89 100644
--- a/pkg/rest/client.go
+++ b/pkg/rest/client.go
@@ -21,6 +21,7 @@ import (
 	"compress/gzip"
 	"encoding/json"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"io"
 	"io/ioutil"
@@ -113,14 +114,14 @@ func gzipCompress(src []byte) (dst []byte) {
 func readAndGunzip(reader io.Reader) (dst []byte, err error) {
 	gzipReader, err := gzip.NewReader(reader)
 	if err != nil {
-		util.Logger().Errorf(err, "duplicate gzip reader failed.")
+		log.Errorf(err, "duplicate gzip reader failed.")
 		return nil, err
 	}
 
 	defer gzipReader.Close()
 	dst, err = ioutil.ReadAll(gzipReader)
 	if err != nil {
-		util.Logger().Errorf(err, "read from gzip reader failed.")
+		log.Errorf(err, "read from gzip reader failed.")
 		return nil, err
 	}
 
@@ -138,7 +139,7 @@ func (client *HttpClient) httpDo(method string, url string, headers map[string]s
 			// 如果请求头未传入Content-Type,则按照json格式进行编码(如果是非json类型,需要自行在headers里指定类型)
 			bodyBytes, err = json.Marshal(body)
 			if err != nil {
-				util.Logger().Errorf(err, "marshal object failed.")
+				log.Errorf(err, "marshal object failed.")
 				return status, result
 			}
 		} else {
@@ -146,7 +147,7 @@ func (client *HttpClient) httpDo(method string, url string, headers map[string]s
 			var ok bool = false
 			bodyBytes, ok = body.([]byte)
 			if !ok {
-				util.Logger().Errorf(nil,
+				log.Errorf(nil,
 					"invalid body type '%s'(%s), body must type of byte array if Content-Type specified.",
 					reflect.TypeOf(body), headers[HEADER_CONTENT_TYPE])
 				return status, result
@@ -163,7 +164,7 @@ func (client *HttpClient) httpDo(method string, url string, headers map[string]s
 
 	req, err := http.NewRequest(method, url, bodyReader)
 	if err != nil {
-		util.Logger().Errorf(err, "create request failed.")
+		log.Errorf(err, "create request failed.")
 		return status, result
 	}
 
@@ -174,7 +175,7 @@ func (client *HttpClient) httpDo(method string, url string, headers map[string]s
 
 	resp, err := client.Client.Do(req)
 	if err != nil {
-		util.Logger().Errorf(err, "invoke request failed.")
+		log.Errorf(err, "invoke request failed.")
 		return status, result
 	}
 
@@ -201,7 +202,7 @@ func (client *HttpClient) HttpDo(method string, url string, headers map[string]s
 			// 如果请求头未传入Conent-Type,则按照json格式进行编码(如果是非json类型,需要自行在headers里指定类型)
 			bodyBytes, err = json.Marshal(body)
 			if err != nil {
-				util.Logger().Errorf(err, "marshal object failed.")
+				log.Errorf(err, "marshal object failed.")
 				return nil, err
 			}
 		} else {
@@ -211,7 +212,7 @@ func (client *HttpClient) HttpDo(method string, url string, headers map[string]s
 			if !ok {
 				err := fmt.Errorf("invalid body type '%s'(%s), body must type of byte array if Content-Type specified.",
 					reflect.TypeOf(body), headers[HEADER_CONTENT_TYPE])
-				util.Logger().Errorf(err, "")
+				log.Errorf(err, "")
 				return nil, err
 			}
 		}
@@ -226,7 +227,7 @@ func (client *HttpClient) HttpDo(method string, url string, headers map[string]s
 
 	req, err := http.NewRequest(method, url, bodyReader)
 	if err != nil {
-		util.Logger().Errorf(err, "create request failed.")
+		log.Errorf(err, "create request failed.")
 		return nil, err
 	}
 
@@ -237,7 +238,7 @@ func (client *HttpClient) HttpDo(method string, url string, headers map[string]s
 
 	resp, err := client.Client.Do(req)
 	if err != nil {
-		util.Logger().Errorf(err, "Request -----> %s failed.", url)
+		log.Errorf(err, "Request -----> %s failed.", url)
 		return resp, err
 	}
 	return resp, err
diff --git a/pkg/rest/roa.go b/pkg/rest/roa.go
index f217fad..b3b1dc8 100644
--- a/pkg/rest/roa.go
+++ b/pkg/rest/roa.go
@@ -17,6 +17,7 @@
 package rest
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"net/http"
 	"reflect"
@@ -46,38 +47,38 @@ func RegisterServant(servant interface{}) {
 	typ := ind.Type()
 	name := util.FileLastName(typ.PkgPath() + "." + typ.Name())
 	if val.Kind() != reflect.Ptr {
-		util.Logger().Errorf(nil, "<rest.RegisterServant> cannot use non-ptr servant struct `%s`", name)
+		log.Errorf(nil, "<rest.RegisterServant> cannot use non-ptr servant struct `%s`", name)
 		return
 	}
 
 	urlPatternFunc := val.MethodByName("URLPatterns")
 	if !urlPatternFunc.IsValid() {
-		util.Logger().Errorf(nil, "<rest.RegisterServant> no 'URLPatterns' function in servant struct `%s`", name)
+		log.Errorf(nil, "<rest.RegisterServant> no 'URLPatterns' function in servant struct `%s`", name)
 		return
 	}
 
 	vals := urlPatternFunc.Call([]reflect.Value{})
 	if len(vals) <= 0 {
-		util.Logger().Errorf(nil, "<rest.RegisterServant> call 'URLPatterns' function failed in servant struct `%s`", name)
+		log.Errorf(nil, "<rest.RegisterServant> call 'URLPatterns' function failed in servant struct `%s`", name)
 		return
 	}
 
 	val0 := vals[0]
 	if !val.CanInterface() {
-		util.Logger().Errorf(nil, "<rest.RegisterServant> result of 'URLPatterns' function not interface type in servant struct `%s`", name)
+		log.Errorf(nil, "<rest.RegisterServant> result of 'URLPatterns' function not interface type in servant struct `%s`", name)
 		return
 	}
 
 	if routes, ok := val0.Interface().([]Route); ok {
-		util.Logger().Infof("register servant %s", name)
+		log.Infof("register servant %s", name)
 		for _, route := range routes {
 			err := serverHandler.addRoute(&route)
 			if err != nil {
-				util.Logger().Errorf(err, "register route failed.")
+				log.Errorf(err, "register route failed.")
 			}
 		}
 	} else {
-		util.Logger().Errorf(nil, "<rest.RegisterServant> result of 'URLPatterns' function not []*Route type in servant struct `%s`", name)
+		log.Errorf(nil, "<rest.RegisterServant> result of 'URLPatterns' function not []*Route type in servant struct `%s`", name)
 	}
 }
 
diff --git a/pkg/rest/route.go b/pkg/rest/route.go
index 084fe44..f00e59d 100644
--- a/pkg/rest/route.go
+++ b/pkg/rest/route.go
@@ -21,6 +21,7 @@ import (
 	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/chain"
 	errorsEx "github.com/apache/incubator-servicecomb-service-center/pkg/errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"net/http"
 	"net/url"
@@ -65,13 +66,13 @@ func (this *ROAServerHandler) addRoute(route *Route) (err error) {
 	method := strings.ToUpper(route.Method)
 	if !isValidMethod(method) || !strings.HasPrefix(route.Path, "/") || route.Func == nil {
 		message := fmt.Sprintf("Invalid route parameters(method: %s, path: %s)", method, route.Path)
-		util.Logger().Errorf(nil, message)
+		log.Errorf(nil, message)
 		return errors.New(message)
 	}
 
 	this.handlers[method] = append(this.handlers[method], &urlPatternHandler{
 		util.FormatFuncName(util.FuncName(route.Func)), route.Path, http.HandlerFunc(route.Func)})
-	util.Logger().Infof("register route %s(%s)", route.Path, method)
+	log.Infof("register route %s(%s)", route.Path, method)
 
 	return nil
 }
@@ -128,7 +129,7 @@ func (this *ROAServerHandler) serve(ph *urlPatternHandler, w http.ResponseWriter
 					err := ret.Err
 					itf := recover()
 					if itf != nil {
-						util.LogPanic(itf)
+						log.LogPanic(itf)
 
 						err = errorsEx.RaiseError(itf)
 					}
diff --git a/pkg/rest/server.go b/pkg/rest/server.go
index 0bcabb6..6b5841f 100644
--- a/pkg/rest/server.go
+++ b/pkg/rest/server.go
@@ -19,7 +19,7 @@ package rest
 import (
 	"crypto/tls"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/grace"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"net"
 	"net/http"
 	"os"
@@ -102,22 +102,22 @@ func (srv *Server) Serve() (err error) {
 	defer func() {
 		srv.state = serverStateClosed
 	}()
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	srv.state = serverStateRunning
 	err = srv.Server.Serve(srv.Listener)
-	util.Logger().Debugf("server serve failed(%s)", err)
+	log.Debugf("server serve failed(%s)", err)
 	srv.wg.Wait()
 	return
 }
 
 func (srv *Server) AcceptOne() {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	srv.wg.Add(1)
 	atomic.AddInt64(&srv.conns, 1)
 }
 
 func (srv *Server) CloseOne() bool {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	for {
 		left := atomic.LoadInt64(&srv.conns)
 		if left <= 0 {
@@ -231,7 +231,7 @@ func (srv *Server) Shutdown() {
 	srv.state = serverStateTerminating
 	err := srv.Listener.Close()
 	if err != nil {
-		util.Logger().Errorf(err, "server listener close failed")
+		log.Errorf(err, "server listener close failed")
 	}
 
 	if srv.GraceTimeout >= 0 {
@@ -260,10 +260,10 @@ func (srv *Server) gracefulStop(d time.Duration) {
 	}
 
 	if n != 0 {
-		util.Logger().Warnf("%s timed out, force close %d connection(s)", d, n)
+		log.Warnf("%s timed out, force close %d connection(s)", d, n)
 		err := srv.Server.Close()
 		if err != nil {
-			util.Logger().Errorf(err, "server close failed")
+			log.Errorf(err, "server close failed")
 		}
 	}
 }
diff --git a/pkg/task/executor.go b/pkg/task/executor.go
index 6e24285..bf2c406 100644
--- a/pkg/task/executor.go
+++ b/pkg/task/executor.go
@@ -18,13 +18,14 @@ package task
 
 import (
 	"errors"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/queue"
 	"golang.org/x/net/context"
 )
 
 type Executor struct {
-	pool       *util.GoRoutine
-	tasks      *util.UniQueue
+	pool       *gopool.Pool
+	tasks      *queue.UniQueue
 	latestTask Task
 }
 
@@ -59,10 +60,10 @@ func (s *Executor) Close() {
 	s.tasks.Close()
 }
 
-func NewExecutor(pool *util.GoRoutine, task Task) *Executor {
+func NewExecutor(pool *gopool.Pool, task Task) *Executor {
 	return &Executor{
 		pool:       pool,
-		tasks:      util.NewUniQueue(),
+		tasks:      queue.NewUniQueue(),
 		latestTask: task,
 	}
 }
diff --git a/pkg/task/service_async.go b/pkg/task/service_async.go
index 53f8007..4677bfe 100644
--- a/pkg/task/service_async.go
+++ b/pkg/task/service_async.go
@@ -18,6 +18,8 @@ package task
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"golang.org/x/net/context"
 	"sync"
@@ -40,7 +42,7 @@ type executorWithTTL struct {
 
 type AsyncTaskService struct {
 	executors map[string]*executorWithTTL
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 	lock      sync.RWMutex
 	ready     chan struct{}
 	isClose   bool
@@ -111,7 +113,7 @@ func (lat *AsyncTaskService) daemon(ctx context.Context) {
 	for {
 		select {
 		case <-ctx.Done():
-			util.Logger().Debugf("daemon thread exited for AsyncTaskService stopped")
+			log.Debugf("daemon thread exited for AsyncTaskService stopped")
 			return
 		case <-timer.C:
 			lat.lock.RLock()
@@ -160,7 +162,7 @@ func (lat *AsyncTaskService) daemon(ctx context.Context) {
 			}
 			lat.lock.Unlock()
 
-			util.Logger().Debugf("daemon thread completed, %d executor(s) removed", len(removes))
+			log.Debugf("daemon thread completed, %d executor(s) removed", len(removes))
 		}
 	}
 }
@@ -209,7 +211,7 @@ func (lat *AsyncTaskService) renew() {
 
 func NewTaskService() TaskService {
 	lat := &AsyncTaskService{
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 		ready:     make(chan struct{}),
 		isClose:   true,
 	}
diff --git a/pkg/tlsutil/tlsutil.go b/pkg/tlsutil/tlsutil.go
index 4995ecd..fcf444d 100644
--- a/pkg/tlsutil/tlsutil.go
+++ b/pkg/tlsutil/tlsutil.go
@@ -20,6 +20,7 @@ import (
 	"crypto/tls"
 	"crypto/x509"
 	"encoding/pem"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"io/ioutil"
 	"strings"
@@ -42,7 +43,7 @@ func ParseSSLCipherSuites(ciphers string, permitTlsCipherSuiteMap map[string]uin
 			cipherSuiteList = append(cipherSuiteList, cipherSuite)
 		} else {
 			// 配置算法不存在
-			util.Logger().Warnf("cipher %s not exist.", cipherSuiteName)
+			log.Warnf("cipher %s not exist.", cipherSuiteName)
 		}
 	}
 
@@ -58,7 +59,7 @@ func ParseSSLProtocol(sprotocol string) uint16 {
 	if protocol, ok := TLS_VERSION_MAP[sprotocol]; ok {
 		result = protocol
 	} else {
-		util.Logger().Warnf("invalid ssl minimal version(%s), use default.", sprotocol)
+		log.Warnf("invalid ssl minimal version(%s), use default.", sprotocol)
 	}
 
 	return result
@@ -68,7 +69,7 @@ func GetX509CACertPool(caCertFile string) (caCertPool *x509.CertPool, err error)
 	pool := x509.NewCertPool()
 	caCert, err := ioutil.ReadFile(caCertFile)
 	if err != nil {
-		util.Logger().Errorf(err, "read ca cert file %s failed.", caCertFile)
+		log.Errorf(err, "read ca cert file %s failed.", caCertFile)
 		return nil, err
 	}
 
@@ -79,19 +80,19 @@ func GetX509CACertPool(caCertFile string) (caCertPool *x509.CertPool, err error)
 func LoadTLSCertificate(certFile, keyFile, plainPassphase string) (tlsCert []tls.Certificate, err error) {
 	certContent, err := ioutil.ReadFile(certFile)
 	if err != nil {
-		util.Logger().Errorf(err, "read cert file %s failed.", certFile)
+		log.Errorf(err, "read cert file %s failed.", certFile)
 		return nil, err
 	}
 
 	keyContent, err := ioutil.ReadFile(keyFile)
 	if err != nil {
-		util.Logger().Errorf(err, "read key file %s failed.", keyFile)
+		log.Errorf(err, "read key file %s failed.", keyFile)
 		return nil, err
 	}
 
 	keyBlock, _ := pem.Decode(keyContent)
 	if keyBlock == nil {
-		util.Logger().Errorf(err, "decode key file %s failed.", keyFile)
+		log.Errorf(err, "decode key file %s failed.", keyFile)
 		return nil, err
 	}
 
@@ -99,7 +100,7 @@ func LoadTLSCertificate(certFile, keyFile, plainPassphase string) (tlsCert []tls
 		plainPassphaseBytes := util.StringToBytesWithNoCopy(plainPassphase)
 		keyData, err := x509.DecryptPEMBlock(keyBlock, plainPassphaseBytes)
 		if err != nil {
-			util.Logger().Errorf(err, "decrypt key file %s failed.", keyFile)
+			log.Errorf(err, "decrypt key file %s failed.", keyFile)
 			return nil, err
 		}
 
@@ -114,7 +115,7 @@ func LoadTLSCertificate(certFile, keyFile, plainPassphase string) (tlsCert []tls
 
 	cert, err := tls.X509KeyPair(certContent, keyContent)
 	if err != nil {
-		util.Logger().Errorf(err, "load X509 key pair from cert file %s with key file %s failed.", certFile, keyFile)
+		log.Errorf(err, "load X509 key pair from cert file %s with key file %s failed.", certFile, keyFile)
 		return nil, err
 	}
 
diff --git a/pkg/util/log.go b/pkg/util/log.go
deleted file mode 100644
index 9f1da95..0000000
--- a/pkg/util/log.go
+++ /dev/null
@@ -1,245 +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 util
-
-import (
-	"fmt"
-	stlager "github.com/go-chassis/paas-lager"
-	"github.com/go-chassis/paas-lager/third_party/forked/cloudfoundry/lager"
-	"golang.org/x/net/context"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"sync"
-	"time"
-)
-
-//log var
-var (
-	globalLogger     lager.Logger
-	globalConfig     LoggerConfig
-	innerLagerConfig = stlager.DefaultConfig()
-	logLevel         lager.LogLevel
-
-	loggers     map[string]lager.Logger
-	loggerNames map[string]string
-	loggersMux  sync.RWMutex
-
-	stdOutWriters = []string{"stdout"}
-	fileWriters   = []string{"file"}
-)
-
-// LoggerConfig struct for lager and rotate parameters
-type LoggerConfig struct {
-	LoggerLevel     string
-	LoggerFile      string
-	LogFormatText   bool
-	LogRotatePeriod time.Duration
-	LogRotateSize   int
-	LogBackupCount  int
-}
-
-func init() {
-	loggers = make(map[string]lager.Logger, 10)
-	loggerNames = make(map[string]string, 10)
-	// make globalLogger do not be nil, new a stdout for it
-	globalLogger = NewLogger(fromLagerConfig(innerLagerConfig))
-}
-
-func fromLagerConfig(c *stlager.Config) LoggerConfig {
-	return LoggerConfig{
-		LoggerLevel:   c.LoggerLevel,
-		LoggerFile:    c.LoggerFile,
-		LogFormatText: c.LogFormatText,
-	}
-}
-
-func toLagerConfig(c LoggerConfig) stlager.Config {
-	w := fileWriters
-	if len(c.LoggerFile) == 0 {
-		w = stdOutWriters
-	}
-	return stlager.Config{
-		Writers:       w,
-		LoggerLevel:   c.LoggerLevel,
-		LoggerFile:    c.LoggerFile,
-		LogFormatText: c.LogFormatText,
-	}
-}
-
-// newLog new log, unsafe
-func NewLogger(cfg LoggerConfig) lager.Logger {
-	stlager.Init(toLagerConfig(cfg))
-	return stlager.NewLogger(cfg.LoggerFile)
-}
-
-func InitGlobalLogger(cfg LoggerConfig) {
-	// renew the global globalLogger
-	if len(cfg.LoggerLevel) == 0 {
-		cfg.LoggerLevel = innerLagerConfig.LoggerLevel
-	}
-	globalConfig = cfg
-	globalLogger = NewLogger(cfg)
-	// recreate the deleted log file
-	switch strings.ToUpper(cfg.LoggerLevel) {
-	case "INFO":
-		logLevel = lager.INFO
-	case "WARN":
-		logLevel = lager.WARN
-	case "ERROR":
-		logLevel = lager.ERROR
-	case "FATAL":
-		logLevel = lager.FATAL
-	default:
-		logLevel = lager.DEBUG
-	}
-
-	RunLogDirRotate(cfg)
-
-	monitorLogFile()
-}
-
-func Logger() lager.Logger {
-	if len(loggerNames) == 0 {
-		return globalLogger
-	}
-	funcFullName := getCalleeFuncName()
-
-	for prefix, logFile := range loggerNames {
-		if strings.Index(prefix, "/") < 0 {
-			// function name
-			if prefix != funcFullName[strings.LastIndex(funcFullName, " ")+1:] {
-				continue
-			}
-		} else {
-			// package name
-			if strings.Index(funcFullName, prefix) < 0 {
-				continue
-			}
-		}
-		loggersMux.RLock()
-		logger, ok := loggers[logFile]
-		loggersMux.RUnlock()
-		if ok {
-			return logger
-		}
-
-		loggersMux.Lock()
-		logger, ok = loggers[logFile]
-		if !ok {
-			cfg := globalConfig
-			if len(cfg.LoggerFile) != 0 {
-				cfg.LoggerFile = filepath.Join(filepath.Dir(cfg.LoggerFile), logFile+".log")
-			}
-			logger = NewLogger(cfg)
-			loggers[logFile] = logger
-			logger.Warnf("match %s, new globalLogger %s for %s", prefix, logFile, funcFullName)
-		}
-		loggersMux.Unlock()
-		return logger
-	}
-
-	return globalLogger
-}
-
-func getCalleeFuncName() string {
-	fullName := ""
-	for i := 2; i <= 4; i++ {
-		pc, file, _, ok := runtime.Caller(i)
-
-		if strings.Index(file, "/log.go") > 0 {
-			continue
-		}
-
-		if ok {
-			idx := strings.LastIndex(file, "/src/")
-			switch {
-			case idx >= 0:
-				fullName = file[idx+4:]
-			default:
-				fullName = file
-			}
-
-			if f := runtime.FuncForPC(pc); f != nil {
-				fullName += " " + FormatFuncName(f.Name())
-			}
-		}
-		break
-	}
-	return fullName
-}
-
-func CustomLogger(pkgOrFunc, fileName string) {
-	loggerNames[pkgOrFunc] = fileName
-}
-
-func monitorLogFile() {
-	if len(globalConfig.LoggerFile) == 0 {
-		return
-	}
-	Go(func(ctx context.Context) {
-		for {
-			select {
-			case <-ctx.Done():
-				return
-			case <-time.After(time.Minute):
-				Logger().Debug(fmt.Sprintf("Check log file at %s", time.Now()))
-				if PathExist(globalConfig.LoggerFile) {
-					continue
-				}
-
-				file, err := os.OpenFile(globalConfig.LoggerFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
-				if err != nil {
-					Logger().Errorf(err, "Create log file failed.")
-					continue
-				}
-
-				// TODO Here will lead to file handle leak
-				sink := lager.NewReconfigurableSink(lager.NewWriterSink("file", file, lager.DEBUG), logLevel)
-				Logger().RegisterSink(sink)
-				Logger().Errorf(nil, "log file is removed, create again.")
-			}
-		}
-	})
-}
-
-func LogNilOrWarnf(start time.Time, format string, args ...interface{}) {
-	cost := time.Now().Sub(start)
-	if cost < time.Second {
-		return
-	}
-	Logger().Warnf("[%s]%s", cost, fmt.Sprintf(format, args...))
-}
-
-func LogDebugOrWarnf(start time.Time, format string, args ...interface{}) {
-	cost := time.Now().Sub(start)
-	if cost < time.Second {
-		Logger().Debugf("[%s]%s", cost, fmt.Sprintf(format, args...))
-		return
-	}
-	Logger().Warnf("[%s]%s", cost, fmt.Sprintf(format, args...))
-}
-
-func LogInfoOrWarnf(start time.Time, format string, args ...interface{}) {
-	cost := time.Now().Sub(start)
-	if cost < time.Second {
-		Logger().Infof("[%s]%s", cost, fmt.Sprintf(format, args...))
-		return
-	}
-	Logger().Warnf("[%s]%s", cost, fmt.Sprintf(format, args...))
-}
diff --git a/pkg/util/log_test.go b/pkg/util/log_test.go
deleted file mode 100644
index 9d0bdbf..0000000
--- a/pkg/util/log_test.go
+++ /dev/null
@@ -1,84 +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 util
-
-import (
-	"testing"
-	"time"
-)
-
-func TestLogger(t *testing.T) {
-	InitGlobalLogger(LoggerConfig{
-		LoggerLevel: "DEBUG",
-	})
-
-	CustomLogger("Not Exist", "testDefaultLOGGER")
-	l := Logger()
-	if l != globalLogger {
-		t.Fatalf("should equal to globalLogger")
-	}
-	CustomLogger("TestLogger", "testFuncName")
-	l = Logger()
-	if l == globalLogger || l == nil {
-		t.Fatalf("should create a new instance for 'TestLogger'")
-	}
-	s := Logger()
-	if l != s {
-		t.Fatalf("should be the same globalLogger")
-	}
-	CustomLogger("github.com/apache/incubator-servicecomb-service-center/pkg/util", "testPkgPath")
-	l = Logger()
-	if l == globalLogger || l == nil {
-		t.Fatalf("should create a new instance for 'util'")
-	}
-	// l.Infof("OK")
-
-	LogDebugOrWarnf(time.Now().Add(-time.Second), "x")
-	LogNilOrWarnf(time.Now().Add(-time.Second), "x")
-	LogInfoOrWarnf(time.Now().Add(-time.Second), "x")
-
-	LogDebugOrWarnf(time.Now(), "x")
-	LogNilOrWarnf(time.Now(), "x")
-	LogInfoOrWarnf(time.Now(), "x")
-}
-
-func BenchmarkLogger(b *testing.B) {
-	l := Logger()
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			l.Debugf("debug test")
-			l.Infof("info test")
-		}
-	})
-	// after:	50000	     20964 ns/op	    1296 B/op	      18 allocs/op
-	// before:	50000	     31378 ns/op	    2161 B/op	      30 allocs/op
-	b.ReportAllocs()
-}
-
-func BenchmarkLoggerCustom(b *testing.B) {
-	CustomLogger("BenchmarkLoggerCustom", "bmLogger")
-	l := Logger()
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			l.Debugf("debug test")
-			l.Infof("info test")
-		}
-	})
-	// after:	100000	     21374 ns/op	    1296 B/op	      18 allocs/op
-	// before:	50000	     21804 ns/op	    2161 B/op	      30 allocs/op
-	b.ReportAllocs()
-}
diff --git a/pkg/util/reflect.go b/pkg/util/reflect.go
index 7ea324d..f45572a 100644
--- a/pkg/util/reflect.go
+++ b/pkg/util/reflect.go
@@ -25,10 +25,8 @@ import (
 )
 
 var (
-	reflector      *Reflector
-	sliceTypeSize  = uint64(reflect.TypeOf(reflect.SliceHeader{}).Size())
-	stringTypeSize = uint64(reflect.TypeOf(reflect.StringHeader{}).Size())
-	unknown        = new(reflectObject)
+	reflector *Reflector
+	unknown   = new(reflectObject)
 )
 
 func init() {
diff --git a/pkg/util/sys.go b/pkg/util/sys.go
index 7100e2e..9bd81ef 100644
--- a/pkg/util/sys.go
+++ b/pkg/util/sys.go
@@ -58,7 +58,6 @@ func GetEnvInt(name string, def int) int {
 	if ok {
 		i64, err := strconv.ParseInt(env, 10, 0)
 		if err != nil {
-			Logger().Errorf(err, "get env '%s' value failed, return default value '%d'", name, def)
 			return def
 		}
 		return int(i64)
diff --git a/pkg/util/util.go b/pkg/util/util.go
index d1dfd0c..42d34f0 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -17,10 +17,7 @@
 package util
 
 import (
-	"fmt"
-	"os"
 	"runtime"
-	"runtime/debug"
 	"strings"
 	"time"
 	"unsafe"
@@ -89,39 +86,12 @@ func StringJoin(args []string, sep string) string {
 	}
 }
 
-func RecoverAndReport() (r interface{}) {
-	if r = recover(); r != nil {
-		LogPanic(r)
-	}
-	return
-}
-
 func GetCaller(skip int) (string, string, int, bool) {
 	pc, file, line, ok := runtime.Caller(skip + 1)
 	method := FormatFuncName(runtime.FuncForPC(pc).Name())
 	return file, method, line, ok
 }
 
-// this function can only be called in recover().
-func LogPanic(args ...interface{}) {
-	for i := 2; i < 10; i++ {
-		file, method, line, ok := GetCaller(i)
-		if !ok {
-			break
-		}
-
-		if strings.Index(file, "service-center") > 0 || strings.Index(file, "servicecenter") > 0 {
-			Logger().Errorf(nil, "recover from %s %s():%d! %s", FileLastName(file), method, line, fmt.Sprint(args...))
-			return
-		}
-	}
-
-	file, method, line, _ := GetCaller(0)
-	fmt.Fprintln(os.Stderr, time.Now().Format("2006-01-02T15:04:05.000Z07:00"), "FATAL", "system", os.Getpid(),
-		fmt.Sprintf("%s %s():%d", FileLastName(file), method, line), fmt.Sprint(args...))
-	fmt.Fprintln(os.Stderr, BytesToStringWithNoCopy(debug.Stack()))
-}
-
 func Int16ToInt64(bs []int16) (in int64) {
 	l := len(bs)
 	if l > 4 || l == 0 {
diff --git a/scripts/release/LICENSE b/scripts/release/LICENSE
index 5c9fb10..a2fa902 100644
--- a/scripts/release/LICENSE
+++ b/scripts/release/LICENSE
@@ -852,3 +852,31 @@ This product bundles the css-percentage-circle library which is
 licensed under the MIT License.
 For details, see https://github.com/afuersch/css-percentage-circle
 You can find a copy of the License at licenses/LICENSE-css-percentage-circle
+
+================================================================
+For zap (4d45f9617f7d90f7a663ff21c7a4321dbe78098b)
+================================================================
+This product bundles the zap library which is licensed under the MIT License.
+For details, see https://github.com/uber-go/zap
+You can find a copy of the License at licenses/LICENSE-uber-go-zap
+
+================================================================
+For atomic (1ea20fb1cbb1cc08cbd0d913a96dead89aa18289)
+================================================================
+This product bundles the atomic library which is licensed under the MIT License.
+For details, see https://github.com/uber-go/atomic
+You can find a copy of the License at licenses/LICENSE-uber-go-atomic
+
+================================================================
+For multierr (3c4937480c32f4c13a875a1829af76c98ca3d40a)
+================================================================
+This product bundles the multierr library which is licensed under the MIT License.
+For details, see https://github.com/uber-go/multierr
+You can find a copy of the License at licenses/LICENSE-uber-go-multierr
+
+================================================================
+For lumberjack (a96e63847dc3c67d17befa69c303767e2f84e54f)
+================================================================
+This product bundles the lumberjack library which is licensed under the MIT License.
+For details, see https://github.com/natefinch/lumberjack
+You can find a copy of the License at licenses/LICENSE-natefinch-lumberjack
diff --git a/scripts/release/licenses/LICENSE-natefinch-lumberjack b/scripts/release/licenses/LICENSE-natefinch-lumberjack
new file mode 100644
index 0000000..8d6bb4a
--- /dev/null
+++ b/scripts/release/licenses/LICENSE-natefinch-lumberjack
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Nate Finch
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/scripts/release/licenses/LICENSE-uber-go-atomic b/scripts/release/licenses/LICENSE-uber-go-atomic
new file mode 100644
index 0000000..721b703
--- /dev/null
+++ b/scripts/release/licenses/LICENSE-uber-go-atomic
@@ -0,0 +1,19 @@
+Copyright (c) 2016 Uber Technologies, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/scripts/release/licenses/LICENSE-uber-go-multierr b/scripts/release/licenses/LICENSE-uber-go-multierr
new file mode 100644
index 0000000..20dcf51
--- /dev/null
+++ b/scripts/release/licenses/LICENSE-uber-go-multierr
@@ -0,0 +1,19 @@
+Copyright (c) 2017 Uber Technologies, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/scripts/release/licenses/LICENSE-uber-go-zap b/scripts/release/licenses/LICENSE-uber-go-zap
new file mode 100644
index 0000000..2cf1638
--- /dev/null
+++ b/scripts/release/licenses/LICENSE-uber-go-zap
@@ -0,0 +1,19 @@
+Copyright (c) 2016-2017 Uber Technologies, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/server/admin/service.go b/server/admin/service.go
index 166a057..2a6554e 100644
--- a/server/admin/service.go
+++ b/server/admin/service.go
@@ -17,6 +17,7 @@
 package admin
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/admin/model"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
@@ -51,7 +52,7 @@ func (service *AdminService) Dump(ctx context.Context, in *model.DumpRequest) (*
 }
 
 func (service *AdminService) dumpAll(ctx context.Context, cache *model.Cache) {
-	util.NewGo(ctx, util.PoolConfigure().Workers(2)).
+	gopool.New(ctx, gopool.Configure().Workers(2)).
 		Do(func(_ context.Context) { setValue(backend.Store().Service(), &cache.Microservices) }).
 		Do(func(_ context.Context) { setValue(backend.Store().ServiceIndex(), &cache.Indexes) }).
 		Do(func(_ context.Context) { setValue(backend.Store().ServiceAlias(), &cache.Aliases) }).
diff --git a/server/api.go b/server/api.go
index 7f7bdcb..e5c5429 100644
--- a/server/api.go
+++ b/server/api.go
@@ -18,9 +18,10 @@ package server
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/grace"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	rs "github.com/apache/incubator-servicecomb-service-center/server/rest"
@@ -40,7 +41,7 @@ func init() {
 	apiServer = &APIServer{
 		isClose:   true,
 		err:       make(chan error, 1),
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 }
 
@@ -70,7 +71,7 @@ type APIServer struct {
 	isClose   bool
 	forked    bool
 	err       chan error
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 }
 
 const (
@@ -95,14 +96,14 @@ func (s *APIServer) registryService(pCtx context.Context) error {
 	ctx := core.AddDefaultContextValue(pCtx)
 	respE, err := core.ServiceAPI.Exist(ctx, core.GetExistenceRequest())
 	if err != nil {
-		util.Logger().Error("query service center existence failed", err)
+		log.Error("query service center existence failed", err)
 		return err
 	}
 	if respE.Response.Code == pb.Response_SUCCESS {
-		util.Logger().Warnf("service center service already registered, serviceId %s", respE.ServiceId)
+		log.Warnf("service center service already registered, serviceId %s", respE.ServiceId)
 		respG, err := core.ServiceAPI.GetOne(ctx, core.GetServiceRequest(respE.ServiceId))
 		if respG.Response.Code != pb.Response_SUCCESS {
-			util.Logger().Errorf(err, "query service center service info failed, serviceId %s", respE.ServiceId)
+			log.Errorf(err, "query service center service info failed, serviceId %s", respE.ServiceId)
 			return fmt.Errorf("service center service file lost.")
 		}
 		core.Service = respG.Service
@@ -111,11 +112,11 @@ func (s *APIServer) registryService(pCtx context.Context) error {
 
 	respS, err := core.ServiceAPI.Create(ctx, core.CreateServiceRequest())
 	if err != nil {
-		util.Logger().Error("register service center failed", err)
+		log.Error("register service center failed", err)
 		return err
 	}
 	core.Service.ServiceId = respS.ServiceId
-	util.Logger().Infof("register service center service %s", respS.ServiceId)
+	log.Infof("register service center service %s", respS.ServiceId)
 	return nil
 }
 
@@ -134,11 +135,11 @@ func (s *APIServer) registryInstance(pCtx context.Context) error {
 		core.RegisterInstanceRequest(s.HostName, endpoints))
 	if respI.Response.Code != pb.Response_SUCCESS {
 		err = fmt.Errorf("register service center instance failed, %s", respI.Response.Message)
-		util.Logger().Error(err.Error(), nil)
+		log.Error(err.Error(), nil)
 		return err
 	}
 	core.Instance.InstanceId = respI.InstanceId
-	util.Logger().Infof("register service center instance %s/%s, endpoints %s",
+	log.Infof("register service center instance %s/%s, endpoints %s",
 		core.Service.ServiceId, respI.InstanceId, endpoints)
 	return nil
 }
@@ -151,10 +152,10 @@ func (s *APIServer) unregisterInstance(pCtx context.Context) error {
 	respI, err := core.InstanceAPI.Unregister(ctx, core.UnregisterInstanceRequest())
 	if respI.Response.Code != pb.Response_SUCCESS {
 		err = fmt.Errorf("unregister service center instance failed, %s", respI.Response.Message)
-		util.Logger().Error(err.Error(), nil)
+		log.Error(err.Error(), nil)
 		return err
 	}
-	util.Logger().Warnf("unregister service center instance %s/%s",
+	log.Warnf("unregister service center instance %s/%s",
 		core.Service.ServiceId, core.Instance.InstanceId)
 	return nil
 }
@@ -166,17 +167,17 @@ func (s *APIServer) doAPIServerHeartBeat(pCtx context.Context) {
 	ctx := core.AddDefaultContextValue(pCtx)
 	respI, err := core.InstanceAPI.Heartbeat(ctx, core.HeartbeatRequest())
 	if respI.Response.Code == pb.Response_SUCCESS {
-		util.Logger().Debugf("update service center instance %s/%s heartbeat",
+		log.Debugf("update service center instance %s/%s heartbeat",
 			core.Instance.ServiceId, core.Instance.InstanceId)
 		return
 	}
-	util.Logger().Errorf(err, "update service center instance %s/%s heartbeat failed",
+	log.Errorf(err, "update service center instance %s/%s heartbeat failed",
 		core.Instance.ServiceId, core.Instance.InstanceId)
 
 	//服务不存在,创建服务
 	err = s.registerServiceCenter()
 	if err != nil {
-		util.Logger().Errorf(err, "retry to register %s/%s/%s failed.",
+		log.Errorf(err, "retry to register %s/%s/%s failed.",
 			core.Service.AppId, core.Service.ServiceName, core.Service.Version)
 	}
 }
@@ -200,7 +201,7 @@ func (s *APIServer) graceDone() {
 	grace.Before(s.MarkForked)
 	grace.After(s.Stop)
 	if err := grace.Done(); err != nil {
-		util.Logger().Errorf(err, "server reload failed")
+		log.Errorf(err, "server reload failed")
 	}
 }
 
@@ -241,7 +242,7 @@ func (s *APIServer) startRESTServer() (err error) {
 	if err != nil {
 		return
 	}
-	util.Logger().Infof("listen address: %s://%s, host: %s.",
+	log.Infof("listen address: %s://%s, host: %s.",
 		REST, s.restSrv.Listener.Addr().String(), s.HostName)
 
 	s.AddEndpoint(REST, s.restSrv.Listener.Addr().String())
@@ -251,7 +252,7 @@ func (s *APIServer) startRESTServer() (err error) {
 		if s.isClose {
 			return
 		}
-		util.Logger().Errorf(err, "error to start REST API server %s", addr)
+		log.Errorf(err, "error to start REST API server %s", addr)
 		s.err <- err
 	})
 	return
@@ -267,7 +268,7 @@ func (s *APIServer) startRPCServer() (err error) {
 	if err != nil {
 		return
 	}
-	util.Logger().Infof("listen address: %s://%s, host: %s.",
+	log.Infof("listen address: %s://%s, host: %s.",
 		RPC, s.rpcSrv.Listener.Addr().String(), s.HostName)
 
 	s.AddEndpoint(RPC, s.rpcSrv.Listener.Addr().String())
@@ -277,7 +278,7 @@ func (s *APIServer) startRPCServer() (err error) {
 		if s.isClose {
 			return
 		}
-		util.Logger().Errorf(err, "error to start RPC API server %s", addr)
+		log.Errorf(err, "error to start RPC API server %s", addr)
 		s.err <- err
 	})
 	return
@@ -316,7 +317,7 @@ func (s *APIServer) Start() {
 
 	ReportScInstance()
 
-	util.Logger().Info("api server is ready")
+	log.Info("api server is ready")
 }
 
 func (s *APIServer) Stop() {
@@ -342,7 +343,7 @@ func (s *APIServer) Stop() {
 
 	s.goroutine.Close(true)
 
-	util.Logger().Info("api server stopped.")
+	log.Info("api server stopped.")
 }
 
 func GetAPIServer() *APIServer {
diff --git a/server/bootstrap/bootstrap.go b/server/bootstrap/bootstrap.go
index f0efb35..e0c4070 100644
--- a/server/bootstrap/bootstrap.go
+++ b/server/bootstrap/bootstrap.go
@@ -56,7 +56,7 @@ import _ "github.com/apache/incubator-servicecomb-service-center/server/admin"
 import _ "github.com/apache/incubator-servicecomb-service-center/server/metric"
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/handler/auth"
 	"github.com/apache/incubator-servicecomb-service-center/server/handler/cache"
 	"github.com/apache/incubator-servicecomb-service-center/server/handler/context"
@@ -69,7 +69,7 @@ import (
 )
 
 func init() {
-	util.Logger().Info("BootStrap ServiceComb.io Edition")
+	log.Info("BootStrap ServiceComb.io Edition")
 
 	// intercept requests before routing.
 	interceptor.RegisterInterceptFunc(access.Intercept)
diff --git a/server/broker/service.go b/server/broker/service.go
index ec0a96a..dac2b2a 100644
--- a/server/broker/service.go
+++ b/server/broker/service.go
@@ -24,6 +24,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/broker/brokerpb"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
@@ -766,7 +767,7 @@ func (*BrokerService) PublishPact(ctx context.Context, in *brokerpb.PublishPactR
 
 	// check that the consumer has that vesion in the url
 	if strings.Compare(consumer.GetVersion(), in.Version) != 0 {
-		util.Logger().Errorf(nil,
+		log.Errorf(nil,
 			"pact publish failed, version (%s) does not exist for consmer", in.Version)
 		return &brokerpb.PublishPactResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, "Consumer Version does not exist."),
diff --git a/server/broker/util.go b/server/broker/util.go
index 9b43341..f09c4aa 100644
--- a/server/broker/util.go
+++ b/server/broker/util.go
@@ -24,6 +24,7 @@ import (
 	"strconv"
 	"strings"
 
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/broker/brokerpb"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
@@ -32,12 +33,10 @@ import (
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	serviceUtil "github.com/apache/incubator-servicecomb-service-center/server/service/util"
-	"github.com/go-chassis/paas-lager/third_party/forked/cloudfoundry/lager"
 	"path/filepath"
-	"time"
 )
 
-var PactLogger lager.Logger
+var PactLogger *log.Logger
 
 const (
 	BROKER_HOME_URL                      = "/"
@@ -94,13 +93,12 @@ func init() {
 	if len(core.ServerInfo.Config.LogFilePath) != 0 {
 		name = filepath.Join(filepath.Dir(core.ServerInfo.Config.LogFilePath), "broker_srvc.log")
 	}
-	PactLogger = util.NewLogger(util.LoggerConfig{
-		LoggerLevel:     core.ServerInfo.Config.LogLevel,
-		LoggerFile:      name,
-		LogFormatText:   core.ServerInfo.Config.LogFormat == "text",
-		LogRotatePeriod: 30 * time.Second,
-		LogRotateSize:   int(core.ServerInfo.Config.LogRotateSize),
-		LogBackupCount:  int(core.ServerInfo.Config.LogBackupCount),
+	PactLogger = log.NewLogger(log.Config{
+		LoggerLevel:    core.ServerInfo.Config.LogLevel,
+		LoggerFile:     name,
+		LogFormatText:  core.ServerInfo.Config.LogFormat == "text",
+		LogRotateSize:  int(core.ServerInfo.Config.LogRotateSize),
+		LogBackupCount: int(core.ServerInfo.Config.LogBackupCount),
 	})
 }
 
@@ -266,7 +264,7 @@ func StoreData(ctx context.Context, key string, value string) error {
 	return err
 }
 
-func CreateParticipant(pactLogger lager.Logger, ctx context.Context, participantKey string, participant brokerpb.Participant) (*brokerpb.PublishPactResponse, error) {
+func CreateParticipant(pactLogger *log.Logger, ctx context.Context, participantKey string, participant brokerpb.Participant) (*brokerpb.PublishPactResponse, error) {
 	data, err := json.Marshal(participant)
 	if err != nil {
 		PactLogger.Errorf(nil, "pact publish failed, participant cannot be created.")
@@ -300,7 +298,7 @@ func CreateParticipant(pactLogger lager.Logger, ctx context.Context, participant
 	return nil, nil
 }
 
-func CreateVersion(pactLogger lager.Logger, ctx context.Context, versionKey string,
+func CreateVersion(pactLogger *log.Logger, ctx context.Context, versionKey string,
 	version brokerpb.Version) (*brokerpb.PublishPactResponse, error) {
 	data, err := json.Marshal(version)
 	if err != nil {
@@ -333,7 +331,7 @@ func CreateVersion(pactLogger lager.Logger, ctx context.Context, versionKey stri
 	return nil, nil
 }
 
-func CreatePact(pactLogger lager.Logger, ctx context.Context,
+func CreatePact(pactLogger *log.Logger, ctx context.Context,
 	pactKey string, pact brokerpb.Pact) (*brokerpb.PublishPactResponse, error) {
 	data, err := json.Marshal(pact)
 	if err != nil {
@@ -368,7 +366,7 @@ func CreatePact(pactLogger lager.Logger, ctx context.Context,
 	return nil, nil
 }
 
-func CreatePactVersion(pactLogger lager.Logger, ctx context.Context, pactVersionKey string, pactVersion brokerpb.PactVersion) (*brokerpb.PublishPactResponse, error) {
+func CreatePactVersion(pactLogger *log.Logger, ctx context.Context, pactVersionKey string, pactVersion brokerpb.PactVersion) (*brokerpb.PublishPactResponse, error) {
 	data, err := json.Marshal(pactVersion)
 	if err != nil {
 		PactLogger.Errorf(nil, "pact publish failed, pact version cannot be created.")
@@ -399,7 +397,7 @@ func CreatePactVersion(pactLogger lager.Logger, ctx context.Context, pactVersion
 	return nil, nil
 }
 
-func CreateVerification(pactLogger lager.Logger, ctx context.Context,
+func CreateVerification(pactLogger *log.Logger, ctx context.Context,
 	verificationKey string, verification brokerpb.Verification) (*brokerpb.PublishVerificationResponse, error) {
 	data, err := json.Marshal(verification)
 	if err != nil {
diff --git a/server/core/backend/backend.go b/server/core/backend/backend.go
index 2b14735..d768205 100644
--- a/server/core/backend/backend.go
+++ b/server/core/backend/backend.go
@@ -18,6 +18,7 @@ package backend
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	"github.com/apache/incubator-servicecomb-service-center/server/plugin"
@@ -56,7 +57,7 @@ func Registry() registry.Registry {
 		for i := 0; registryInstance == nil; i++ {
 			inst, err := New()
 			if err != nil {
-				util.Logger().Errorf(err, "get register center client failed")
+				log.Errorf(err, "get register center client failed")
 			}
 			registryInstance = inst
 
@@ -66,7 +67,7 @@ func Registry() registry.Registry {
 			}
 
 			t := util.GetBackoff().Delay(i)
-			util.Logger().Errorf(nil, "initialize service center failed, retry after %s", t)
+			log.Errorf(nil, "initialize service center failed, retry after %s", t)
 			<-time.After(t)
 		}
 		singletonLock.Unlock()
diff --git a/server/core/backend/cacher_kv.go b/server/core/backend/cacher_kv.go
index 7f97b67..2394a4f 100644
--- a/server/core/backend/cacher_kv.go
+++ b/server/core/backend/cacher_kv.go
@@ -19,6 +19,8 @@ package backend
 import (
 	"errors"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/proto"
@@ -40,7 +42,7 @@ type KvCacher struct {
 	mux       sync.Mutex
 	once      sync.Once
 	cache     Cache
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 }
 
 func (c *KvCacher) Config() *Config {
@@ -62,7 +64,7 @@ func (c *KvCacher) needList() bool {
 		return false
 	}
 
-	util.Logger().Debugf("no events come in more then %s, need to list key %s, rev: %d",
+	log.Debugf("no events come in more then %s, need to list key %s, rev: %d",
 		time.Duration(c.noEventPeriods)*c.Cfg.Timeout, c.Cfg.Key, rev)
 	c.noEventPeriods = 0
 	return true
@@ -80,11 +82,11 @@ func (c *KvCacher) doList(cfg ListWatchConfig) error {
 	evts := c.filter(c.lw.Revision(), kvs)
 	if ec, kc := len(evts), len(kvs); c.Cfg.DeferHandler != nil && ec == 0 && kc != 0 &&
 		c.Cfg.DeferHandler.Reset() {
-		util.Logger().Warnf("most of the protected data(%d/%d) are recovered",
+		log.Warnf("most of the protected data(%d/%d) are recovered",
 			kc, c.cache.GetAll(nil))
 	}
 	c.sync(evts)
-	util.LogDebugOrWarnf(start, "finish to cache key %s, %d items, rev: %d",
+	log.LogDebugOrWarnf(start, "finish to cache key %s, %d items, rev: %d",
 		c.Cfg.Key, len(kvs), c.lw.Revision())
 
 	return nil
@@ -143,7 +145,7 @@ func (c *KvCacher) handleWatcher(watcher Watcher) error {
 					evt.KV = c.doParse(kv)
 				}
 			default:
-				util.Logger().Errorf(nil, "unknown KeyValue %v", kv)
+				log.Errorf(nil, "unknown KeyValue %v", kv)
 				continue
 			}
 			if evt.KV == nil {
@@ -152,7 +154,7 @@ func (c *KvCacher) handleWatcher(watcher Watcher) error {
 			evts = append(evts, evt)
 		}
 		c.sync(evts)
-		util.LogDebugOrWarnf(start, "finish to handle %d events, prefix: %s, rev: %d",
+		log.LogDebugOrWarnf(start, "finish to handle %d events, prefix: %s, rev: %d",
 			len(evts), c.Cfg.Key, rev)
 	}
 	return nil
@@ -167,7 +169,7 @@ func (c *KvCacher) needDeferHandle(evts []KvEvent) bool {
 }
 
 func (c *KvCacher) refresh(ctx context.Context) {
-	util.Logger().Debugf("start to list and watch %s", c.Cfg)
+	log.Debugf("start to list and watch %s", c.Cfg)
 	retries := 0
 
 	timer := time.NewTimer(minWaitInterval)
@@ -183,7 +185,7 @@ func (c *KvCacher) refresh(ctx context.Context) {
 
 		select {
 		case <-ctx.Done():
-			util.Logger().Debugf("stop to list and watch %s", c.Cfg)
+			log.Debugf("stop to list and watch %s", c.Cfg)
 			return
 		case <-timer.C:
 			timer.Reset(nextPeriod)
@@ -379,11 +381,11 @@ func (c *KvCacher) onEvents(evts []KvEvent) {
 			case init:
 				evt.Type = proto.EVT_INIT
 			case !ok && evt.Type != proto.EVT_CREATE:
-				util.Logger().Warnf("unexpected %s event! it should be %s key %s",
+				log.Warnf("unexpected %s event! it should be %s key %s",
 					evt.Type, proto.EVT_CREATE, key)
 				evt.Type = proto.EVT_CREATE
 			case ok && evt.Type != proto.EVT_UPDATE:
-				util.Logger().Warnf("unexpected %s event! it should be %s key %s",
+				log.Warnf("unexpected %s event! it should be %s key %s",
 					evt.Type, proto.EVT_UPDATE, key)
 				evt.Type = proto.EVT_UPDATE
 			}
@@ -392,7 +394,7 @@ func (c *KvCacher) onEvents(evts []KvEvent) {
 			evts[i] = evt
 		case proto.EVT_DELETE:
 			if !ok {
-				util.Logger().Warnf("unexpected %s event! key %s does not cache",
+				log.Warnf("unexpected %s event! key %s does not cache",
 					evt.Type, key)
 			} else {
 				evt.KV = prevKv
@@ -410,7 +412,7 @@ func (c *KvCacher) onKvEvents(evts []KvEvent) {
 		return
 	}
 
-	defer util.RecoverAndReport()
+	defer log.Recover()
 
 	for _, evt := range evts {
 		c.Cfg.OnEvent(evt)
@@ -420,7 +422,7 @@ func (c *KvCacher) onKvEvents(evts []KvEvent) {
 func (c *KvCacher) doParse(src *mvccpb.KeyValue) (kv *KeyValue) {
 	kv = new(KeyValue)
 	if err := kv.From(c.Cfg.Parser, src); err != nil {
-		util.Logger().Errorf(err, "parse %s value failed", util.BytesToStringWithNoCopy(src.Key))
+		log.Errorf(err, "parse %s value failed", util.BytesToStringWithNoCopy(src.Key))
 		return nil
 	}
 	return
@@ -482,7 +484,7 @@ func NewKvCacher(name string, cfg *Config) *KvCacher {
 			Client: Registry(),
 			Prefix: cfg.Key,
 		},
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 	cacher.cache = NewKvCache(name, cfg)
 	return cacher
diff --git a/server/core/backend/cacher_kv_test.go b/server/core/backend/cacher_kv_test.go
index 82455ec..6f8bbed 100644
--- a/server/core/backend/cacher_kv_test.go
+++ b/server/core/backend/cacher_kv_test.go
@@ -17,7 +17,7 @@
 package backend
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	"github.com/coreos/etcd/mvcc/mvccpb"
@@ -72,7 +72,7 @@ func TestNewKvCacher(t *testing.T) {
 		Cfg:       Configure(),
 		ready:     make(chan struct{}),
 		lw:        lw,
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 		cache:     &mockCache{},
 	}
 
@@ -95,7 +95,7 @@ func TestNewKvCacher(t *testing.T) {
 			}),
 		ready:     make(chan struct{}),
 		lw:        lw,
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 		cache:     &mockCache{},
 	}
 
diff --git a/server/core/backend/defer_instance.go b/server/core/backend/defer_instance.go
index 095c5b8..dc4ac0a 100644
--- a/server/core/backend/defer_instance.go
+++ b/server/core/backend/defer_instance.go
@@ -17,6 +17,8 @@
 package backend
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"golang.org/x/net/context"
@@ -52,7 +54,7 @@ func (iedh *InstanceEventDeferHandler) OnCondition(cache Cache, evts []KvEvent)
 		iedh.pendingCh = make(chan []KvEvent, eventBlockSize)
 		iedh.deferCh = make(chan KvEvent, eventBlockSize)
 		iedh.resetCh = make(chan struct{})
-		util.Go(iedh.check)
+		gopool.Go(iedh.check)
 	})
 
 	iedh.pendingCh <- evts
@@ -66,7 +68,7 @@ func (iedh *InstanceEventDeferHandler) recoverOrDefer(evt KvEvent) error {
 	switch evt.Type {
 	case pb.EVT_CREATE, pb.EVT_UPDATE:
 		if ok {
-			util.Logger().Infof("recovered key %s events", key)
+			log.Infof("recovered key %s events", key)
 			// return nil // no need to publish event to subscribers?
 		}
 		iedh.recover(evt)
@@ -90,7 +92,7 @@ func (iedh *InstanceEventDeferHandler) HandleChan() <-chan KvEvent {
 }
 
 func (iedh *InstanceEventDeferHandler) check(ctx context.Context) {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 
 	t, n := time.NewTimer(DEFAULT_CHECK_WINDOW), false
 	defer t.Stop()
@@ -115,7 +117,7 @@ func (iedh *InstanceEventDeferHandler) check(ctx context.Context) {
 			total := iedh.cache.GetAll(nil)
 			if total > 5 && float64(del) >= float64(total)*iedh.Percent {
 				iedh.enabled = true
-				util.Logger().Warnf("self preservation is enabled, caught %d/%d(>=%.0f%%) DELETE events",
+				log.Warnf("self preservation is enabled, caught %d/%d(>=%.0f%%) DELETE events",
 					del, total, iedh.Percent*100)
 			}
 
@@ -133,20 +135,20 @@ func (iedh *InstanceEventDeferHandler) check(ctx context.Context) {
 					default:
 						continue
 					}
-					util.Logger().Warnf("defer handle timed out, removed key is %s", key)
+					log.Warnf("defer handle timed out, removed key is %s", key)
 				}
 				iedh.recover(item.event)
 			}
 
 			if iedh.enabled && len(iedh.items) == 0 {
 				iedh.renew()
-				util.Logger().Warnf("self preservation is stopped")
+				log.Warnf("self preservation is stopped")
 			}
 
 			t.Reset(DEFAULT_CHECK_WINDOW)
 		case <-iedh.resetCh:
 			iedh.renew()
-			util.Logger().Warnf("self preservation is reset")
+			log.Warnf("self preservation is reset")
 
 			util.ResetTimer(t, DEFAULT_CHECK_WINDOW)
 		}
diff --git a/server/core/backend/entity_kv.go b/server/core/backend/entity_kv.go
index 4496137..61d16af 100644
--- a/server/core/backend/entity_kv.go
+++ b/server/core/backend/entity_kv.go
@@ -17,7 +17,7 @@
 package backend
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"sync"
 )
@@ -58,7 +58,7 @@ func NewKvEntity(name string, cfg *Config) *KvEntity {
 		entity.Cacher = NewKvCacher(name, cfg)
 		entity.Indexer = NewCacheIndexer(cfg, entity.Cache())
 	default:
-		util.Logger().Infof(
+		log.Infof(
 			"core will not cache '%s' and ignore all events of it, cache enabled: %v, init size: %d",
 			name, core.ServerInfo.Config.EnableCache, cfg.InitSize)
 		entity.Indexer = NewCommonIndexer(cfg.Key, cfg.Parser)
diff --git a/server/core/backend/indexer_kv.go b/server/core/backend/indexer_kv.go
index d1fb766..c627ee3 100644
--- a/server/core/backend/indexer_kv.go
+++ b/server/core/backend/indexer_kv.go
@@ -18,6 +18,7 @@ package backend
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	"golang.org/x/net/context"
@@ -42,7 +43,7 @@ func (i *CacheIndexer) Search(ctx context.Context, opts ...registry.PluginOpOpti
 		op.Mode == registry.MODE_NO_CACHE ||
 		op.Revision > 0 ||
 		(op.Offset >= 0 && op.Limit > 0) {
-		util.Logger().Debugf("search '%s' match special options, request etcd server, opts: %s",
+		log.Debugf("search '%s' match special options, request etcd server, opts: %s",
 			key, op)
 		return i.CommonIndexer.Search(ctx, opts...)
 	}
@@ -62,7 +63,7 @@ func (i *CacheIndexer) Search(ctx context.Context, opts ...registry.PluginOpOpti
 		return resp, nil
 	}
 
-	util.Logger().Debugf("can not find any key from %s cache, request etcd server, key: %s",
+	log.Debugf("can not find any key from %s cache, request etcd server, key: %s",
 		i.Cache.Name(), key)
 	return i.CommonIndexer.Search(ctx, opts...)
 }
@@ -98,7 +99,7 @@ func (i *CacheIndexer) searchByPrefix(op registry.PluginOp) *Response {
 	kvs := make([]*KeyValue, 0, resp.Count)
 	i.Cache.GetPrefix(prefix, &kvs)
 
-	util.LogNilOrWarnf(t, "too long to index data[%d] from cache '%s'", len(kvs), i.Cache.Name())
+	log.LogNilOrWarnf(t, "too long to index data[%d] from cache '%s'", len(kvs), i.Cache.Name())
 
 	resp.Kvs = kvs
 	return resp
diff --git a/server/core/backend/lease.go b/server/core/backend/lease.go
index 928e95d..106de63 100644
--- a/server/core/backend/lease.go
+++ b/server/core/backend/lease.go
@@ -18,6 +18,7 @@ package backend
 
 import (
 	errorsEx "github.com/apache/incubator-servicecomb-service-center/pkg/errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	"golang.org/x/net/context"
@@ -44,7 +45,7 @@ func (lat *LeaseTask) Do(ctx context.Context) (err error) {
 	recv, start := lat.ReceiveTime(), time.Now()
 	lat.TTL, err = lat.Client.LeaseRenew(ctx, lat.LeaseID)
 	if err != nil {
-		util.Logger().Errorf(err, "[%s]renew lease %d failed(recv: %s, send: %s), key %s",
+		log.Errorf(err, "[%s]renew lease %d failed(recv: %s, send: %s), key %s",
 			time.Now().Sub(recv),
 			lat.LeaseID,
 			recv.Format(TIME_FORMAT),
@@ -61,7 +62,7 @@ func (lat *LeaseTask) Do(ctx context.Context) (err error) {
 
 	cost := time.Now().Sub(recv)
 	if cost >= 2*time.Second {
-		util.Logger().Warnf("[%s]renew lease %d(recv: %s, send: %s), key %s", cost,
+		log.Warnf("[%s]renew lease %d(recv: %s, send: %s), key %s", cost,
 			lat.LeaseID,
 			recv.Format(TIME_FORMAT),
 			start.Format(TIME_FORMAT),
diff --git a/server/core/backend/listwatch_inner.go b/server/core/backend/listwatch_inner.go
index 70b7234..5cf401a 100644
--- a/server/core/backend/listwatch_inner.go
+++ b/server/core/backend/listwatch_inner.go
@@ -18,7 +18,7 @@ package backend
 
 import (
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	"golang.org/x/net/context"
 )
@@ -34,7 +34,7 @@ func (lw *innerListWatch) List(op ListWatchConfig) (*registry.PluginResponse, er
 	otCtx, _ := context.WithTimeout(op.Context, op.Timeout)
 	resp, err := lw.Client.Do(otCtx, registry.WatchPrefixOpOptions(lw.Prefix)...)
 	if err != nil {
-		util.Logger().Errorf(err, "list prefix %s failed, current rev: %d", lw.Prefix, lw.Revision())
+		log.Errorf(err, "list prefix %s failed, current rev: %d", lw.Prefix, lw.Revision())
 		return nil, err
 	}
 	lw.setRevision(resp.Revision)
@@ -72,7 +72,7 @@ func (lw *innerListWatch) DoWatch(ctx context.Context, f func(*registry.PluginRe
 
 	err := lw.Client.Watch(ctx, opts...)
 	if err != nil { // compact可能会导致watch失败 or message body size lager than 4MB
-		util.Logger().Errorf(err, "watch prefix %s failed, start rev: %d+1->%d->0", lw.Prefix, rev, lw.Revision())
+		log.Errorf(err, "watch prefix %s failed, start rev: %d+1->%d->0", lw.Prefix, rev, lw.Revision())
 
 		lw.setRevision(0)
 		f(nil)
diff --git a/server/core/backend/store.go b/server/core/backend/store.go
index 6eb01e7..8c175ba 100644
--- a/server/core/backend/store.go
+++ b/server/core/backend/store.go
@@ -19,6 +19,8 @@ package backend
 import (
 	"errors"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/task"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
@@ -37,7 +39,7 @@ type KvStore struct {
 	taskService task.TaskService
 	lock        sync.RWMutex
 	ready       chan struct{}
-	goroutine   *util.GoRoutine
+	goroutine   *gopool.Pool
 	isClose     bool
 	rev         int64
 }
@@ -46,7 +48,7 @@ func (s *KvStore) Initialize() {
 	s.entities = util.NewConcurrentMap(0)
 	s.taskService = task.NewTaskService()
 	s.ready = make(chan struct{})
-	s.goroutine = util.NewGo(context.Background())
+	s.goroutine = gopool.New(context.Background())
 }
 
 func (s *KvStore) OnCacheEvent(evt KvEvent) {
@@ -72,7 +74,7 @@ func (s *KvStore) getOrCreateEntity(t StoreType) Entity {
 		return e, nil
 	})
 	if err != nil {
-		util.Logger().Errorf(err, "can not find entity '%s', new default one", t.String())
+		log.Errorf(err, "can not find entity '%s', new default one", t.String())
 		return DefaultKvEntity()
 
 	}
@@ -95,7 +97,7 @@ func (s *KvStore) store(ctx context.Context) {
 
 	util.SafeCloseChan(s.ready)
 
-	util.Logger().Debugf("all entities are ready")
+	log.Debugf("all entities are ready")
 }
 
 func (s *KvStore) closed() bool {
@@ -119,7 +121,7 @@ func (s *KvStore) Stop() {
 
 	util.SafeCloseChan(s.ready)
 
-	util.Logger().Debugf("store daemon stopped")
+	log.Debugf("store daemon stopped")
 }
 
 func (s *KvStore) Ready() <-chan struct{} {
@@ -158,7 +160,7 @@ func (s *KvStore) Install(e Extension) (id StoreType, err error) {
 		return
 	}
 
-	util.Logger().Infof("install new store entity %d:%s->%s", id, e.Name(), e.Config().Key)
+	log.Infof("install new store entity %d:%s->%s", id, e.Name(), e.Config().Key)
 	return
 }
 
@@ -192,7 +194,7 @@ func (s *KvStore) KeepAlive(ctx context.Context, opts ...registry.PluginOpOption
 
 	t := NewLeaseAsyncTask(op)
 	if op.Mode == registry.MODE_NO_CACHE {
-		util.Logger().Debugf("keep alive lease WitchNoCache, request etcd server, op: %s", op)
+		log.Debugf("keep alive lease WitchNoCache, request etcd server, op: %s", op)
 		err := t.Do(ctx)
 		ttl := t.TTL
 		return ttl, err
diff --git a/server/core/backend/watcher_inner.go b/server/core/backend/watcher_inner.go
index 40ec466..683e442 100644
--- a/server/core/backend/watcher_inner.go
+++ b/server/core/backend/watcher_inner.go
@@ -17,7 +17,8 @@
 package backend
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	"golang.org/x/net/context"
 	"sync"
@@ -39,7 +40,7 @@ func (w *innerWatcher) EventBus() <-chan *registry.PluginResponse {
 func (w *innerWatcher) process(_ context.Context) {
 	stopCh := make(chan struct{})
 	ctx, cancel := context.WithTimeout(w.Cfg.Context, w.Cfg.Timeout)
-	util.Go(func(_ context.Context) {
+	gopool.Go(func(_ context.Context) {
 		defer close(stopCh)
 		w.lw.DoWatch(ctx, w.sendEvent)
 	})
@@ -54,7 +55,7 @@ func (w *innerWatcher) process(_ context.Context) {
 }
 
 func (w *innerWatcher) sendEvent(resp *registry.PluginResponse) {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	w.bus <- resp
 }
 
@@ -77,6 +78,6 @@ func newInnerWatcher(lw ListWatch, cfg ListWatchConfig) *innerWatcher {
 		bus:    make(chan *registry.PluginResponse, EVENT_BUS_MAX_SIZE),
 		stopCh: make(chan struct{}),
 	}
-	util.Go(w.process)
+	gopool.Go(w.process)
 	return w
 }
diff --git a/server/core/core.go b/server/core/core.go
index 8562ada..1b6bf98 100644
--- a/server/core/core.go
+++ b/server/core/core.go
@@ -21,8 +21,8 @@ import (
 	"flag"
 	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/grace"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/plugin"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/version"
 	"os"
 	"os/signal"
@@ -63,28 +63,29 @@ func initCommandLine() {
 }
 
 func printVersion() {
-	util.Logger().Infof("service center version: %s", version.Ver().Version)
-	util.Logger().Infof("Build tag: %s", version.Ver().BuildTag)
-	util.Logger().Infof("Go version: %s", runtime.Version())
-	util.Logger().Infof("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)
+	log.Infof("service center version: %s", version.Ver().Version)
+	log.Infof("Build tag: %s", version.Ver().BuildTag)
+	log.Infof("Go version: %s", runtime.Version())
+	log.Infof("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)
 
 	cores := runtime.NumCPU()
 	runtime.GOMAXPROCS(cores)
-	util.Logger().Infof("service center is running simultaneously with %d CPU cores", cores)
+	log.Infof("service center is running simultaneously with %d CPU cores", cores)
 }
 
 func initLogger() {
-	util.InitGlobalLogger(util.LoggerConfig{
-		LoggerLevel:     ServerInfo.Config.LogLevel,
-		LoggerFile:      os.ExpandEnv(ServerInfo.Config.LogFilePath),
-		LogFormatText:   ServerInfo.Config.LogFormat == "text",
-		LogRotatePeriod: 30 * time.Second,
-		LogRotateSize:   int(ServerInfo.Config.LogRotateSize),
-		LogBackupCount:  int(ServerInfo.Config.LogBackupCount),
+	log.SetGlobal(log.Config{
+		LoggerLevel:    ServerInfo.Config.LogLevel,
+		LoggerFile:     os.ExpandEnv(ServerInfo.Config.LogFilePath),
+		LogFormatText:  ServerInfo.Config.LogFormat == "text",
+		LogRotateSize:  int(ServerInfo.Config.LogRotateSize),
+		LogBackupCount: int(ServerInfo.Config.LogBackupCount),
 	})
 }
 
 func handleSignals() {
+	defer log.Sync()
+
 	sigCh := make(chan os.Signal)
 	signal.Notify(sigCh,
 		syscall.SIGINT,
@@ -96,10 +97,10 @@ func handleSignals() {
 		switch sig {
 		case syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM:
 			<-time.After(wait)
-			util.Logger().Warnf("waiting for server response timed out(%s), force shutdown", wait)
+			log.Warnf("waiting for server response timed out(%s), force shutdown", wait)
 			os.Exit(1)
 		default:
-			util.Logger().Warnf("received signal '%v'", sig)
+			log.Warnf("received signal '%v'", sig)
 		}
 	}
 }
diff --git a/server/govern/controller_v4.go b/server/govern/controller_v4.go
index 93d29cc..23d3219 100644
--- a/server/govern/controller_v4.go
+++ b/server/govern/controller_v4.go
@@ -19,8 +19,8 @@ package govern
 import (
 	"net/http"
 
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -71,7 +71,7 @@ func (governService *GovernServiceControllerV4) GetGraph(w http.ResponseWriter,
 		}
 		proResp, err := core.ServiceAPI.GetConsumerDependencies(ctx, proRequest)
 		if err != nil {
-			util.Logger().Errorf(err, "get providers failed. service %s", service.ServiceId)
+			log.Errorf(err, "get providers failed. service %s", service.ServiceId)
 			controller.WriteResponse(w, proResp.Response, nil)
 			return
 		}
diff --git a/server/govern/service.go b/server/govern/service.go
index 247a35b..7384a65 100644
--- a/server/govern/service.go
+++ b/server/govern/service.go
@@ -17,6 +17,8 @@
 package govern
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -78,7 +80,7 @@ func (governService *GovernService) GetServicesInfo(ctx context.Context, in *pb.
 	//获取所有服务
 	services, err := serviceUtil.GetAllServiceUtil(ctx)
 	if err != nil {
-		util.Logger().Errorf(err, "Get all services for govern service failed.")
+		log.Errorf(err, "Get all services for govern service failed.")
 		return &pb.GetServicesInfoResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -151,7 +153,7 @@ func (governService *GovernService) GetServiceDetail(ctx context.Context, in *pb
 	}
 	versions, err := getServiceAllVersions(ctx, key)
 	if err != nil {
-		util.Logger().Errorf(err, "Get service all version failed.")
+		log.Errorf(err, "Get service all version failed.")
 		return &pb.GetServiceDetailResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -252,7 +254,7 @@ func getSchemaInfoUtil(ctx context.Context, domainProject string, serviceId stri
 		registry.WithStrKey(key),
 		registry.WithPrefix())
 	if err != nil {
-		util.Logger().Errorf(err, "Get schema failed")
+		log.Errorf(err, "Get schema failed")
 		return make([]*pb.Schema, 0), err
 	}
 	schemas := make([]*pb.Schema, 0, len(resp.Kvs))
@@ -280,14 +282,14 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 		case "tags":
 			tags, err := serviceUtil.GetTagsUtils(ctx, domainProject, serviceId)
 			if err != nil {
-				util.Logger().Errorf(err, "Get all tags for govern service failed.")
+				log.Errorf(err, "Get all tags for govern service failed.")
 				return nil, err
 			}
 			serviceDetail.Tags = tags
 		case "rules":
 			rules, err := serviceUtil.GetRulesUtil(ctx, domainProject, serviceId)
 			if err != nil {
-				util.Logger().Errorf(err, "Get all rules for govern service failed.")
+				log.Errorf(err, "Get all rules for govern service failed.")
 				return nil, err
 			}
 			for _, rule := range rules {
@@ -298,7 +300,7 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 			if serviceDetailOpt.countOnly {
 				instanceCount, err := serviceUtil.GetInstanceCountOfOneService(ctx, domainProject, serviceId)
 				if err != nil {
-					util.Logger().Errorf(err, "Get service's instances count for govern service failed.")
+					log.Errorf(err, "Get service's instances count for govern service failed.")
 					return nil, err
 				}
 				serviceDetail.Statics.Instances = &pb.StInstance{
@@ -307,14 +309,14 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 			}
 			instances, err := serviceUtil.GetAllInstancesOfOneService(ctx, domainProject, serviceId)
 			if err != nil {
-				util.Logger().Errorf(err, "Get service's all instances for govern service failed.")
+				log.Errorf(err, "Get service's all instances for govern service failed.")
 				return nil, err
 			}
 			serviceDetail.Instances = instances
 		case "schemas":
 			schemas, err := getSchemaInfoUtil(ctx, domainProject, serviceId)
 			if err != nil {
-				util.Logger().Errorf(err, "Get service's all schemas for govern service failed.")
+				log.Errorf(err, "Get service's all schemas for govern service failed.")
 				return nil, err
 			}
 			serviceDetail.SchemaInfos = schemas
@@ -325,14 +327,14 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 				serviceUtil.WithoutSelfDependency(),
 				serviceUtil.WithSameDomainProject())
 			if err != nil {
-				util.Logger().Errorf(err, "Get service's all consumers for govern service failed.")
+				log.Errorf(err, "Get service's all consumers for govern service failed.")
 				return nil, err
 			}
 			providers, err := dr.GetDependencyProviders(
 				serviceUtil.WithoutSelfDependency(),
 				serviceUtil.WithSameDomainProject())
 			if err != nil {
-				util.Logger().Errorf(err, "Get service's all providers for govern service failed.")
+				log.Errorf(err, "Get service's all providers for govern service failed.")
 				return nil, err
 			}
 
@@ -341,7 +343,7 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 		case "":
 			continue
 		default:
-			util.Logger().Errorf(nil, "option %s from request is invalid.", opt)
+			log.Errorf(nil, "option %s from request is invalid.", opt)
 		}
 	}
 	return serviceDetail, nil
@@ -387,7 +389,7 @@ func statistics(ctx context.Context) (*pb.Statistics, error) {
 	result.Apps.Count = int64(len(app))
 
 	respGetInstanceCountByDomain := make(chan GetInstanceCountByDomainResponse, 1)
-	util.Go(func(_ context.Context) {
+	gopool.Go(func(_ context.Context) {
 		getInstanceCountByDomain(ctx, respGetInstanceCountByDomain)
 	})
 
@@ -440,7 +442,7 @@ func getInstanceCountByDomain(ctx context.Context, resp chan GetInstanceCountByD
 		registry.WithCountOnly())
 	respIns, err := backend.Store().Instance().Search(ctx, instOpts...)
 	if err != nil {
-		util.Logger().Errorf(err, "get instance count under same domainId %s", domainId)
+		log.Errorf(err, "get instance count under same domainId %s", domainId)
 	}
 	resp <- GetInstanceCountByDomainResponse{
 		err:           err,
diff --git a/server/handler/auth/auth.go b/server/handler/auth/auth.go
index c01217d..8ccd64c 100644
--- a/server/handler/auth/auth.go
+++ b/server/handler/auth/auth.go
@@ -18,8 +18,8 @@ package auth
 
 import (
 	"github.com/apache/incubator-servicecomb-service-center/pkg/chain"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
 	"github.com/apache/incubator-servicecomb-service-center/server/plugin"
 	"github.com/apache/incubator-servicecomb-service-center/server/rest/controller"
@@ -37,7 +37,7 @@ func (h *AuthRequest) Handle(i *chain.Invocation) {
 		return
 	}
 
-	util.Logger().Errorf(err, "authenticate request failed, %s %s", r.Method, r.RequestURI)
+	log.Errorf(err, "authenticate request failed, %s %s", r.Method, r.RequestURI)
 
 	w := i.Context().Value(rest.CTX_RESPONSE).(http.ResponseWriter)
 	controller.WriteError(w, scerr.ErrUnauthorized, err.Error())
diff --git a/server/handler/context/v3.go b/server/handler/context/v3.go
index c4c10d9..f063006 100644
--- a/server/handler/context/v3.go
+++ b/server/handler/context/v3.go
@@ -18,6 +18,7 @@ package context
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"net/http"
@@ -44,7 +45,7 @@ func (v *v3Context) Do(r *http.Request) error {
 
 		if len(domain) == 0 {
 			err := errors.New("Header does not contain domain.")
-			util.Logger().Errorf(err, "Invalid Request URI %s", r.RequestURI)
+			log.Errorf(err, "Invalid Request URI %s", r.RequestURI)
 			return err
 		}
 		util.SetDomain(r.Context(), domain)
diff --git a/server/handler/context/v4.go b/server/handler/context/v4.go
index 7fea2c2..95b34df 100644
--- a/server/handler/context/v4.go
+++ b/server/handler/context/v4.go
@@ -18,6 +18,7 @@ package context
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"net/http"
@@ -40,7 +41,7 @@ func (v *v4Context) Do(r *http.Request) error {
 		domain = r.Header.Get("X-Domain-Name")
 		if len(domain) == 0 {
 			err := errors.New("Header does not contain domain.")
-			util.Logger().Errorf(err, "Invalid Request URI %s", r.RequestURI)
+			log.Errorf(err, "Invalid Request URI %s", r.RequestURI)
 			return err
 		}
 		util.SetDomain(r.Context(), domain)
diff --git a/server/handler/metric/metric.go b/server/handler/metric/metric.go
index 6dc977e..0fdc76b 100644
--- a/server/handler/metric/metric.go
+++ b/server/handler/metric/metric.go
@@ -18,8 +18,8 @@ package metric
 
 import (
 	"github.com/apache/incubator-servicecomb-service-center/pkg/chain"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	svr "github.com/apache/incubator-servicecomb-service-center/server/rest"
 	"net/http"
 	"time"
@@ -37,7 +37,7 @@ func (h *MetricsHandler) Handle(i *chain.Invocation) {
 		w, r := i.Context().Value(rest.CTX_RESPONSE).(http.ResponseWriter),
 			i.Context().Value(rest.CTX_REQUEST).(*http.Request)
 		svr.ReportRequestCompleted(w, r, start)
-		util.LogNilOrWarnf(start, "%s %s", r.Method, r.RequestURI)
+		log.LogNilOrWarnf(start, "%s %s", r.Method, r.RequestURI)
 	}))
 }
 
diff --git a/server/infra/quota/quota.go b/server/infra/quota/quota.go
index b4f8bb4..ec61a98 100644
--- a/server/infra/quota/quota.go
+++ b/server/infra/quota/quota.go
@@ -49,14 +49,29 @@ var (
 )
 
 type ApplyQuotaResult struct {
-	Reporter QuotaReporter
-	Err      *scerr.Error
+	Err *scerr.Error
+
+	reporter QuotaReporter
+}
+
+func (r *ApplyQuotaResult) ReportUsedQuota(ctx context.Context) error {
+	if r == nil || r.reporter == nil {
+		return nil
+	}
+	return r.reporter.ReportUsedQuota(ctx)
+}
+
+func (r *ApplyQuotaResult) Close(ctx context.Context) {
+	if r == nil || r.reporter == nil {
+		return
+	}
+	r.reporter.Close(ctx)
 }
 
 func NewApplyQuotaResult(reporter QuotaReporter, err *scerr.Error) *ApplyQuotaResult {
 	return &ApplyQuotaResult{
-		reporter,
-		err,
+		reporter: reporter,
+		Err:      err,
 	}
 }
 
@@ -83,7 +98,7 @@ type QuotaManager interface {
 
 type QuotaReporter interface {
 	ReportUsedQuota(ctx context.Context) error
-	Close()
+	Close(ctx context.Context)
 }
 
 type ResourceType int
diff --git a/server/infra/registry/registry.go b/server/infra/registry/registry.go
index 62adac5..13027d2 100644
--- a/server/infra/registry/registry.go
+++ b/server/infra/registry/registry.go
@@ -19,7 +19,7 @@ package registry
 import (
 	"bytes"
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/astaxie/beego"
 	"github.com/coreos/etcd/mvcc/mvccpb"
@@ -48,19 +48,19 @@ func RegistryConfig() *Config {
 		defaultRegistryConfig.ClusterAddresses = beego.AppConfig.DefaultString("manager_cluster", "http://127.0.0.1:2379")
 		defaultRegistryConfig.DialTimeout, err = time.ParseDuration(beego.AppConfig.DefaultString("registry_timeout", "30s"))
 		if err != nil {
-			util.Logger().Errorf(err, "connect_timeout is invalid, use default time %s", defaultDialTimeout)
+			log.Errorf(err, "connect_timeout is invalid, use default time %s", defaultDialTimeout)
 			defaultRegistryConfig.DialTimeout = defaultDialTimeout
 		}
 		defaultRegistryConfig.RequestTimeOut, err = time.ParseDuration(beego.AppConfig.DefaultString("registry_timeout", "30s"))
 		if err != nil {
-			util.Logger().Errorf(err, "registry_timeout is invalid, use default time %s", defaultRequestTimeout)
+			log.Errorf(err, "registry_timeout is invalid, use default time %s", defaultRequestTimeout)
 			defaultRegistryConfig.RequestTimeOut = defaultRequestTimeout
 		}
 		defaultRegistryConfig.SslEnabled = core.ServerInfo.Config.SslEnabled &&
 			strings.Index(strings.ToLower(defaultRegistryConfig.ClusterAddresses), "https://") >= 0
 		defaultRegistryConfig.AutoSyncInterval, err = time.ParseDuration(core.ServerInfo.Config.AutoSyncInterval)
 		if err != nil {
-			util.Logger().Errorf(err, "auto_sync_interval is invalid")
+			log.Errorf(err, "auto_sync_interval is invalid")
 		}
 	})
 	return &defaultRegistryConfig
diff --git a/server/interceptor/cors/cors.go b/server/interceptor/cors/cors.go
index 079bc77..6d3b8c1 100644
--- a/server/interceptor/cors/cors.go
+++ b/server/interceptor/cors/cors.go
@@ -18,7 +18,7 @@ package cors
 
 import (
 	"errors"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/rs/cors"
 	"net/http"
 )
@@ -35,7 +35,7 @@ func init() {
 func Intercept(w http.ResponseWriter, r *http.Request) (err error) {
 	CORS.HandlerFunc(w, r)
 	if r.Method == "OPTIONS" {
-		util.Logger().Debugf("identify the current request is a CORS, url: %s", r.RequestURI)
+		log.Debugf("identify the current request is a CORS, url: %s", r.RequestURI)
 		err = errors.New("Handle the preflight request")
 	}
 	return
diff --git a/server/interceptor/interceptors.go b/server/interceptor/interceptors.go
index 30441ef..c486882 100644
--- a/server/interceptor/interceptors.go
+++ b/server/interceptor/interceptors.go
@@ -18,6 +18,7 @@ package interceptor
 
 import (
 	errorsEx "github.com/apache/incubator-servicecomb-service-center/pkg/errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"net/http"
 )
@@ -47,14 +48,14 @@ func RegisterInterceptFunc(intc InterceptorFunc) {
 		function: intc,
 	})
 
-	util.Logger().Infof("Intercept %s", intc.Name())
+	log.Infof("Intercept %s", intc.Name())
 }
 
 func InvokeInterceptors(w http.ResponseWriter, req *http.Request) (err error) {
 	var intc *Interception
 	defer func() {
 		if itf := recover(); itf != nil {
-			util.LogPanic(itf)
+			log.LogPanic(itf)
 
 			err = errorsEx.RaiseError(itf)
 
diff --git a/server/metric/gatherer.go b/server/metric/gatherer.go
index c3abb8b..4d07bae 100644
--- a/server/metric/gatherer.go
+++ b/server/metric/gatherer.go
@@ -17,7 +17,8 @@
 package metric
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	pm "github.com/prometheus/client_golang/prometheus"
 	"golang.org/x/net/context"
 	"strings"
@@ -54,7 +55,7 @@ func (mm *MetricsGatherer) Start() {
 	}
 	mm.closed = false
 
-	util.Go(mm.loop)
+	gopool.Go(mm.loop)
 
 	mm.lock.Unlock()
 }
@@ -67,7 +68,7 @@ func (mm *MetricsGatherer) loop(ctx context.Context) {
 			return
 		case <-ticker.C:
 			if err := mm.Collect(); err != nil {
-				util.Logger().Errorf(err, "metrics collect failed.")
+				log.Errorf(err, "metrics collect failed.")
 				return
 			}
 
diff --git a/server/metric/reporter.go b/server/metric/reporter.go
index 1dd6d80..d19a849 100644
--- a/server/metric/reporter.go
+++ b/server/metric/reporter.go
@@ -16,7 +16,7 @@
  */
 package metric
 
-import "github.com/apache/incubator-servicecomb-service-center/pkg/util"
+import "github.com/apache/incubator-servicecomb-service-center/pkg/log"
 
 var reporters = make(map[string]Reporter)
 
@@ -31,7 +31,7 @@ func (*noopReporter) Report() {}
 
 func RegisterReporter(name string, r Reporter) {
 	reporters[name] = r
-	util.Logger().Infof("register metrics reporter '%s'", name)
+	log.Infof("register metrics reporter '%s'", name)
 }
 
 func Report() {
diff --git a/server/plugin/infra/quota/buildin/buildin.go b/server/plugin/infra/quota/buildin/buildin.go
index 0ca8316..a4eb7b0 100644
--- a/server/plugin/infra/quota/buildin/buildin.go
+++ b/server/plugin/infra/quota/buildin/buildin.go
@@ -17,7 +17,7 @@
 package buildin
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
 	"golang.org/x/net/context"
@@ -28,7 +28,7 @@ func init() {
 }
 
 func New() mgr.PluginInstance {
-	util.Logger().Infof("quota init, service: %d, instance: %d, schema: %d/service, tag: %d/service, rule: %d/service",
+	log.Infof("quota init, service: %d, instance: %d, schema: %d/service, tag: %d/service, rule: %d/service",
 		quota.DefaultServiceQuota, quota.DefaultInstanceQuota,
 		quota.DefaultSchemaQuota, quota.DefaultTagQuota, quota.DefaultRuleQuota)
 	return &BuildInQuota{}
@@ -45,7 +45,6 @@ func (q *BuildInQuota) Apply4Quotas(ctx context.Context, res *quota.ApplyQuotaRe
 	}
 
 	return CommonQuotaCheck(ctx, res, resourceQuota(res.QuotaType), resourceLimitHandler)
-
 }
 
 //向配额中心上报配额使用量
diff --git a/server/plugin/infra/quota/buildin/common.go b/server/plugin/infra/quota/buildin/common.go
index 5b269e1..d31ef8c 100644
--- a/server/plugin/infra/quota/buildin/common.go
+++ b/server/plugin/infra/quota/buildin/common.go
@@ -17,8 +17,9 @@
 package buildin
 
 import (
+	"errors"
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -33,16 +34,22 @@ type GetLimitQuota func() int64
 
 func CommonQuotaCheck(ctx context.Context, res *quota.ApplyQuotaResource,
 	getLimitQuota GetLimitQuota, getCurUsedNum GetCurUsedNum) *quota.ApplyQuotaResult {
+	if res == nil || getLimitQuota == nil || getCurUsedNum == nil {
+		err := errors.New("invalid parameters")
+		log.Errorf(err, "quota check failed")
+		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
+	}
+
 	limitQuota := getLimitQuota()
 	curNum, err := getCurUsedNum(ctx, res)
 	if err != nil {
-		util.Logger().Errorf(err, "%s quota check failed", res.QuotaType)
+		log.Errorf(err, "%s quota check failed", res.QuotaType)
 		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrInternal, err.Error()))
 	}
 	if curNum+res.QuotaSize > limitQuota {
 		mes := fmt.Sprintf("no quota to create %s, max num is %d, curNum is %d, apply num is %d",
 			res.QuotaType, limitQuota, curNum, res.QuotaSize)
-		util.Logger().Errorf(nil, mes)
+		log.Errorf(nil, mes)
 		return quota.NewApplyQuotaResult(nil, scerr.NewError(scerr.ErrNotEnoughQuota, mes))
 	}
 	return quota.NewApplyQuotaResult(nil, nil)
diff --git a/server/plugin/infra/quota/buildin/common_test.go b/server/plugin/infra/quota/buildin/common_test.go
new file mode 100644
index 0000000..a3c13a7
--- /dev/null
+++ b/server/plugin/infra/quota/buildin/common_test.go
@@ -0,0 +1,85 @@
+// 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 buildin
+
+import (
+	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
+	"golang.org/x/net/context"
+	"testing"
+)
+
+func TestCommonQuotaCheck(t *testing.T) {
+	// case: invalid input
+	rst := CommonQuotaCheck(context.Background(), nil, func() int64 {
+		return 1
+	}, func(ctx context.Context, resource *quota.ApplyQuotaResource) (int64, error) {
+		return 0, nil
+	})
+	if rst.Err == nil || !rst.Err.InternalError() {
+		t.Fatalf("TestCommonQuotaCheck failed")
+	}
+	rst = CommonQuotaCheck(context.Background(), &quota.ApplyQuotaResource{}, nil, func(ctx context.Context, resource *quota.ApplyQuotaResource) (int64, error) {
+		return 0, nil
+	})
+	if rst.Err == nil || !rst.Err.InternalError() {
+		t.Fatalf("TestCommonQuotaCheck failed")
+	}
+	rst = CommonQuotaCheck(context.Background(), &quota.ApplyQuotaResource{}, func() int64 {
+		return 1
+	}, nil)
+	if rst.Err == nil || !rst.Err.InternalError() {
+		t.Fatalf("TestCommonQuotaCheck failed")
+	}
+
+	// case: error
+	rst = CommonQuotaCheck(context.Background(), &quota.ApplyQuotaResource{
+		QuotaType: quota.MicroServiceQuotaType,
+		QuotaSize: 1,
+	}, func() int64 {
+		return 1
+	}, func(_ context.Context, _ *quota.ApplyQuotaResource) (int64, error) {
+		return 0, errors.New("error")
+	})
+	if rst.Err == nil || !rst.Err.InternalError() {
+		t.Fatalf("TestCommonQuotaCheck failed %v", rst.Err)
+	}
+
+	// case: normal
+	rst = CommonQuotaCheck(context.Background(), &quota.ApplyQuotaResource{
+		QuotaType: quota.MicroServiceQuotaType,
+		QuotaSize: 1,
+	}, func() int64 {
+		return 1
+	}, func(_ context.Context, _ *quota.ApplyQuotaResource) (int64, error) {
+		return 0, nil
+	})
+	if rst.Err != nil {
+		t.Fatalf("TestCommonQuotaCheck failed %v", rst.Err)
+	}
+
+	rst = CommonQuotaCheck(context.Background(), &quota.ApplyQuotaResource{
+		QuotaType: quota.MicroServiceQuotaType,
+		QuotaSize: 1,
+	}, func() int64 {
+		return 1
+	}, func(_ context.Context, _ *quota.ApplyQuotaResource) (int64, error) {
+		return 1, nil
+	})
+	if rst.Err == nil || rst.Err.InternalError() {
+		t.Fatalf("TestCommonQuotaCheck failed %v", rst.Err)
+	}
+}
diff --git a/server/plugin/infra/quota/unlimit/unlimit.go b/server/plugin/infra/quota/unlimit/unlimit.go
index b640ec1..7658284 100644
--- a/server/plugin/infra/quota/unlimit/unlimit.go
+++ b/server/plugin/infra/quota/unlimit/unlimit.go
@@ -17,7 +17,7 @@
 package unlimit
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/quota"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
 	"github.com/astaxie/beego"
@@ -42,7 +42,7 @@ type Unlimit struct {
 }
 
 func New() mgr.PluginInstance {
-	util.Logger().Infof("quota init, all resources are unlimited")
+	log.Infof("quota init, all resources are unlimited")
 	return &Unlimit{}
 }
 
diff --git a/server/plugin/infra/registry/buildin/buildin.go b/server/plugin/infra/registry/buildin/buildin.go
index 3794da0..fd9a0d5 100644
--- a/server/plugin/infra/registry/buildin/buildin.go
+++ b/server/plugin/infra/registry/buildin/buildin.go
@@ -18,7 +18,7 @@ package buildin
 
 import (
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
 	"golang.org/x/net/context"
@@ -35,7 +35,7 @@ type BuildinRegistry struct {
 }
 
 func (ec *BuildinRegistry) safeClose(chan int) {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	close(ec.ready)
 }
 func (ec *BuildinRegistry) Err() (err <-chan error) {
diff --git a/server/plugin/infra/registry/embededetcd/embededetcd.go b/server/plugin/infra/registry/embededetcd/embededetcd.go
index f39257a..20e7525 100644
--- a/server/plugin/infra/registry/embededetcd/embededetcd.go
+++ b/server/plugin/infra/registry/embededetcd/embededetcd.go
@@ -21,6 +21,8 @@ import (
 	"errors"
 	"fmt"
 	errorsEx "github.com/apache/incubator-servicecomb-service-center/pkg/errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
@@ -47,7 +49,7 @@ type EtcdEmbed struct {
 	Embed     *embed.Etcd
 	err       chan error
 	ready     chan int
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 }
 
 func (s *EtcdEmbed) Err() <-chan error {
@@ -63,7 +65,7 @@ func (s *EtcdEmbed) Close() {
 		s.Embed.Close()
 	}
 	s.goroutine.Close(true)
-	util.Logger().Debugf("embedded etcd client stopped.")
+	log.Debugf("embedded etcd client stopped.")
 }
 
 func (s *EtcdEmbed) getPrefixEndKey(prefix []byte) []byte {
@@ -225,24 +227,24 @@ func (s *EtcdEmbed) Compact(ctx context.Context, reserve int64) error {
 	curRev := s.getLeaderCurrentRevision(ctx)
 	revToCompact := max(0, curRev-reserve)
 	if revToCompact <= 0 {
-		util.Logger().Infof("revision is %d, <=%d, no nead to compact", curRev, reserve)
+		log.Infof("revision is %d, <=%d, no nead to compact", curRev, reserve)
 		return nil
 	}
 
-	util.Logger().Infof("Compacting... revision is %d(current: %d, reserve %d)", revToCompact, curRev, reserve)
+	log.Infof("Compacting... revision is %d(current: %d, reserve %d)", revToCompact, curRev, reserve)
 	_, err := s.Embed.Server.Compact(ctx, &etcdserverpb.CompactionRequest{
 		Revision: revToCompact,
 		Physical: true,
 	})
 	if err != nil {
-		util.Logger().Errorf(err, "Compact locally failed, revision is %d(current: %d, reserve %d)",
+		log.Errorf(err, "Compact locally failed, revision is %d(current: %d, reserve %d)",
 			revToCompact, curRev, reserve)
 		return err
 	}
-	util.Logger().Infof("Compacted locally, revision is %d(current: %d, reserve %d)", revToCompact, curRev, reserve)
+	log.Infof("Compacted locally, revision is %d(current: %d, reserve %d)", revToCompact, curRev, reserve)
 
 	// TODO defragment
-	util.Logger().Infof("Defraged locally")
+	log.Infof("Defraged locally")
 
 	return nil
 }
@@ -256,7 +258,7 @@ func (s *EtcdEmbed) PutNoOverride(ctx context.Context, opts ...registry.PluginOp
 	resp, err := s.TxnWithCmp(ctx, []registry.PluginOp{op}, []registry.CompareOp{
 		registry.OpCmp(registry.CmpCreateRev(op.Key), registry.CMP_EQUAL, 0),
 	}, nil)
-	util.Logger().Debugf("response %s %v %v", op.Key, resp.Succeeded, resp.Revision)
+	log.Debugf("response %s %v %v", op.Key, resp.Succeeded, resp.Revision)
 	if err != nil {
 		return false, err
 	}
@@ -468,7 +470,7 @@ func (s *EtcdEmbed) readyNotify() {
 		})
 	case <-time.After(timeout):
 		err := fmt.Errorf("timed out(%s)", timeout)
-		util.Logger().Errorf(err, "read notify failed")
+		log.Errorf(err, "read notify failed")
 
 		s.Embed.Server.Stop()
 
@@ -503,7 +505,7 @@ func setResponseAndCallback(pResp *registry.PluginResponse, kvs []*mvccpb.KeyVal
 }
 
 func getEmbedInstance() mgr.PluginInstance {
-	util.Logger().Warnf("starting service center in embed mode")
+	log.Warnf("starting service center in embed mode")
 
 	hostName := beego.AppConfig.DefaultString("manager_name", "sc-0")
 	mgrAddrs := beego.AppConfig.DefaultString("manager_addr", "http://127.0.0.1:2380")
@@ -511,14 +513,14 @@ func getEmbedInstance() mgr.PluginInstance {
 	inst := &EtcdEmbed{
 		err:       make(chan error, 1),
 		ready:     make(chan int),
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 
 	if registry.RegistryConfig().SslEnabled {
 		var err error
 		embedTLSConfig, err = mgr.Plugins().TLS().ServerConfig()
 		if err != nil {
-			util.Logger().Error("get service center tls config failed", err)
+			log.Error("get service center tls config failed", err)
 			inst.err <- err
 			return inst
 		}
@@ -536,7 +538,7 @@ func getEmbedInstance() mgr.PluginInstance {
 	// 1. 管理端口
 	urls, err := parseURL(mgrAddrs)
 	if err != nil {
-		util.Logger().Error(`"manager_addr" field configure error`, err)
+		log.Error(`"manager_addr" field configure error`, err)
 		inst.err <- err
 		return inst
 	}
@@ -547,7 +549,7 @@ func getEmbedInstance() mgr.PluginInstance {
 	serverCfg.LCUrls = nil
 	serverCfg.ACUrls = nil
 
-	util.Logger().Debugf("--initial-cluster %s --initial-advertise-peer-urls %s --listen-peer-urls %s",
+	log.Debugf("--initial-cluster %s --initial-advertise-peer-urls %s --listen-peer-urls %s",
 		serverCfg.InitialCluster, mgrAddrs, mgrAddrs)
 
 	// 自动压缩历史, 1 hour
@@ -555,7 +557,7 @@ func getEmbedInstance() mgr.PluginInstance {
 
 	etcd, err := embed.StartEtcd(serverCfg)
 	if err != nil {
-		util.Logger().Error("error to start etcd server", err)
+		log.Error("error to start etcd server", err)
 		inst.err <- err
 		return inst
 	}
@@ -571,7 +573,7 @@ func parseURL(addrs string) ([]url.URL, error) {
 	for _, ip := range ips {
 		addr, err := url.Parse(ip)
 		if err != nil {
-			util.Logger().Error("Error to parse ip address string", err)
+			log.Error("Error to parse ip address string", err)
 			return nil, err
 		}
 		urls = append(urls, *addr)
diff --git a/server/plugin/infra/registry/etcd/etcd.go b/server/plugin/infra/registry/etcd/etcd.go
index 1786a70..e08f8e5 100644
--- a/server/plugin/infra/registry/etcd/etcd.go
+++ b/server/plugin/infra/registry/etcd/etcd.go
@@ -21,6 +21,8 @@ import (
 	"errors"
 	"fmt"
 	errorsEx "github.com/apache/incubator-servicecomb-service-center/pkg/errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
@@ -60,13 +62,13 @@ type EtcdClient struct {
 
 	err       chan error
 	ready     chan int
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 }
 
 func (c *EtcdClient) Initialize() (err error) {
 	c.err = make(chan error, 1)
 	c.ready = make(chan int)
-	c.goroutine = util.NewGo(context.Background())
+	c.goroutine = gopool.New(context.Background())
 
 	if len(c.Endpoints) == 0 {
 		// parse the endpoints from config
@@ -77,7 +79,7 @@ func (c *EtcdClient) Initialize() (err error) {
 		// go client tls限制,提供身份证书、不认证服务端、不校验CN
 		c.TLSConfig, err = mgr.Plugins().TLS().ClientConfig()
 		if err != nil {
-			util.Logger().Error("get etcd client tls config failed", err)
+			log.Error("get etcd client tls config failed", err)
 			return err
 		}
 	}
@@ -90,7 +92,7 @@ func (c *EtcdClient) Initialize() (err error) {
 
 	c.Client, err = c.newClient()
 	if err != nil {
-		util.Logger().Errorf(err, "get etcd client %v failed.", c.Endpoints)
+		log.Errorf(err, "get etcd client %v failed.", c.Endpoints)
 		return
 	}
 
@@ -98,7 +100,7 @@ func (c *EtcdClient) Initialize() (err error) {
 
 	close(c.ready)
 
-	util.Logger().Warnf("get etcd client %v completed, auto sync endpoints interval is %s.",
+	log.Warnf("get etcd client %v completed, auto sync endpoints interval is %s.",
 		c.Endpoints, c.AutoSyncInterval)
 	return
 }
@@ -170,7 +172,7 @@ func (c *EtcdClient) Close() {
 	if c.Client != nil {
 		c.Client.Close()
 	}
-	util.Logger().Debugf("etcd client stopped")
+	log.Debugf("etcd client stopped")
 }
 
 func (c *EtcdClient) Compact(ctx context.Context, reserve int64) error {
@@ -179,28 +181,28 @@ func (c *EtcdClient) Compact(ctx context.Context, reserve int64) error {
 
 	revToCompact := max(0, curRev-reserve)
 	if revToCompact <= 0 {
-		util.Logger().Infof("revision is %d, <=%d, no nead to compact %s", curRev, reserve, eps)
+		log.Infof("revision is %d, <=%d, no nead to compact %s", curRev, reserve, eps)
 		return nil
 	}
 
 	t := time.Now()
 	_, err := c.Client.Compact(ctx, revToCompact, clientv3.WithCompactPhysical())
 	if err != nil {
-		util.Logger().Errorf(err, "Compact %s failed, revision is %d(current: %d, reserve %d)",
+		log.Errorf(err, "Compact %s failed, revision is %d(current: %d, reserve %d)",
 			eps, revToCompact, curRev, reserve)
 		return err
 	}
-	util.LogInfoOrWarnf(t, "Compacted %s, revision is %d(current: %d, reserve %d)", eps, revToCompact, curRev, reserve)
+	log.LogInfoOrWarnf(t, "Compacted %s, revision is %d(current: %d, reserve %d)", eps, revToCompact, curRev, reserve)
 
 	// TODO can not defrag! because backend will always be unavailable when space in used is too large.
 	/*for _, ep := range eps {
 		t = time.Now()
 		_, err := c.Client.Defragment(ctx, ep)
 		if err != nil {
-			util.Logger().Errorf(err, "Defrag %s failed", ep)
+			log.Errorf(err, "Defrag %s failed", ep)
 			continue
 		}
-		util.LogInfoOrWarnf(t, "Defraged %s", ep)
+		log.LogInfoOrWarnf(t, "Defraged %s", ep)
 	}*/
 
 	return nil
@@ -212,12 +214,12 @@ func (c *EtcdClient) getLeaderCurrentRevision(ctx context.Context) int64 {
 	for _, ep := range eps {
 		resp, err := c.Client.Status(ctx, ep)
 		if err != nil {
-			util.Logger().Error(fmt.Sprintf("Compact error ,can not get status from %s", ep), err)
+			log.Error(fmt.Sprintf("Compact error ,can not get status from %s", ep), err)
 			continue
 		}
 		curRev = resp.Header.Revision
 		if resp.Leader == resp.Header.MemberId {
-			util.Logger().Infof("Get leader endpoint: %s, revision is %d", ep, curRev)
+			log.Infof("Get leader endpoint: %s, revision is %d", ep, curRev)
 			break
 		}
 	}
@@ -342,7 +344,7 @@ func (c *EtcdClient) PutNoOverride(ctx context.Context, opts ...registry.PluginO
 		registry.OpCmp(registry.CmpCreateRev(op.Key), registry.CMP_EQUAL, 0),
 	}, nil)
 	if err != nil {
-		util.Logger().Errorf(err, "PutNoOverride %s failed", op.Key)
+		log.Errorf(err, "PutNoOverride %s failed", op.Key)
 		return false, err
 	}
 	return resp.Succeeded, nil
@@ -426,7 +428,7 @@ func (c *EtcdClient) paging(ctx context.Context, op registry.PluginOp) (*clientv
 	}
 
 	if op.Offset == -1 {
-		util.LogInfoOrWarnf(start, "get too many KeyValues(%s) from etcd, now paging.(%d vs %d)",
+		log.LogInfoOrWarnf(start, "get too many KeyValues(%s) from etcd, now paging.(%d vs %d)",
 			key, recordCount, op.Limit)
 	}
 
@@ -440,7 +442,7 @@ func (c *EtcdClient) paging(ctx context.Context, op registry.PluginOp) (*clientv
 			}
 			etcdResp.Kvs[i], etcdResp.Kvs[last] = etcdResp.Kvs[last], etcdResp.Kvs[i]
 		}
-		util.LogNilOrWarnf(t, "sorted descend %d KeyValues(%s)", recordCount, key)
+		log.LogNilOrWarnf(t, "sorted descend %d KeyValues(%s)", recordCount, key)
 	}
 	return etcdResp, nil
 }
@@ -514,7 +516,7 @@ func (c *EtcdClient) Do(ctx context.Context, opts ...registry.PluginOpOption) (*
 
 	resp.Succeeded = true
 
-	util.LogNilOrWarnf(start, "registry client do %s", op)
+	log.LogNilOrWarnf(start, "registry client do %s", op)
 	return resp, nil
 }
 
@@ -563,7 +565,7 @@ func (c *EtcdClient) TxnWithCmp(ctx context.Context, success []registry.PluginOp
 	if err != nil {
 		return nil, err
 	}
-	util.LogNilOrWarnf(start, "registry client txn {if(%v): %s, then: %d, else: %d}, rev: %d",
+	log.LogNilOrWarnf(start, "registry client txn {if(%v): %s, then: %d, else: %d}, rev: %d",
 		resp.Succeeded, cmps, len(success), len(fail), resp.Header.Revision)
 	return &registry.PluginResponse{
 		Succeeded: resp.Succeeded,
@@ -584,7 +586,7 @@ func (c *EtcdClient) LeaseGrant(ctx context.Context, TTL int64) (int64, error) {
 	if err != nil {
 		return 0, err
 	}
-	util.LogNilOrWarnf(start, "registry client grant lease %ds", TTL)
+	log.LogNilOrWarnf(start, "registry client grant lease %ds", TTL)
 	return int64(etcdResp.ID), nil
 }
 
@@ -604,7 +606,7 @@ func (c *EtcdClient) LeaseRenew(ctx context.Context, leaseID int64) (int64, erro
 		}
 		return 0, errorsEx.RaiseError(err)
 	}
-	util.LogNilOrWarnf(start, "registry client renew lease %d", leaseID)
+	log.LogNilOrWarnf(start, "registry client renew lease %d", leaseID)
 	return etcdResp.TTL, nil
 }
 
@@ -624,7 +626,7 @@ func (c *EtcdClient) LeaseRevoke(ctx context.Context, leaseID int64) error {
 		}
 		return errorsEx.RaiseError(err)
 	}
-	util.LogNilOrWarnf(start, "registry client revoke lease %d", leaseID)
+	log.LogNilOrWarnf(start, "registry client revoke lease %d", leaseID)
 	return nil
 }
 
@@ -636,7 +638,7 @@ func (c *EtcdClient) Watch(ctx context.Context, opts ...registry.PluginOpOption)
 		// 必须创建新的client连接
 		/*client, err := newClient(c.Client.Endpoints())
 		  if err != nil {
-		          util.Logger().Error("get manager client failed", err)
+		          log.Error("get manager client failed", err)
 		          return err
 		  }
 		  defer client.Close()*/
@@ -710,7 +712,7 @@ hcLoop:
 
 			retries = 1 // fail fast
 			if cerr := c.ReOpen(); cerr == nil {
-				util.Logger().Errorf(err, "re-connected to etcd %s", c.Endpoints)
+				log.Errorf(err, "re-connected to etcd %s", c.Endpoints)
 			}
 		}
 	}
@@ -719,13 +721,13 @@ hcLoop:
 func (c *EtcdClient) ReOpen() error {
 	client, cerr := c.newClient()
 	if cerr != nil {
-		util.Logger().Errorf(cerr, "create a new connection to etcd %v failed.",
+		log.Errorf(cerr, "create a new connection to etcd %v failed.",
 			c.Endpoints)
 		return cerr
 	}
 	c.Client, client = client, c.Client
 	if cerr = client.Close(); cerr != nil {
-		util.Logger().Errorf(cerr, "failed to close the unavailable etcd client.")
+		log.Errorf(cerr, "failed to close the unavailable etcd client.")
 	}
 	client = nil
 	return nil
@@ -813,7 +815,7 @@ func callback(action registry.ActionType, rev int64, kvs []*mvccpb.KeyValue, cb
 }
 
 func NewRegistry() mgr.PluginInstance {
-	util.Logger().Warnf("starting service center in proxy mode")
+	log.Warnf("starting service center in proxy mode")
 
 	inst := &EtcdClient{}
 	if err := inst.Initialize(); err != nil {
diff --git a/server/plugin/infra/registry/etcd/logger.go b/server/plugin/infra/registry/etcd/logger.go
index 349614d..6e04df8 100644
--- a/server/plugin/infra/registry/etcd/logger.go
+++ b/server/plugin/infra/registry/etcd/logger.go
@@ -18,29 +18,30 @@ package etcd
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/coreos/pkg/capnslog"
 	"runtime"
 )
 
+const grpcCallerSkip = 2
+
 // clientLogger implement from grcplog.LoggerV2s and capnslog.Formatter
 type clientLogger struct {
 }
 
 func (l *clientLogger) Format(pkg string, level capnslog.LogLevel, depth int, entries ...interface{}) {
-	fmt := "\b" + l.getCaller(depth) + " " + pkg + " %s"
+	fmt := l.getCaller(depth+1+grpcCallerSkip) + " " + pkg + " %s"
 	switch level {
-	case capnslog.CRITICAL, capnslog.ERROR, capnslog.WARNING, capnslog.INFO:
-		l.Errorf(fmt, entries...)
 	case capnslog.NOTICE, capnslog.DEBUG, capnslog.TRACE:
+		log.Default().Debugf(fmt, entries...)
 	default:
-		return
+		log.Default().Errorf(nil, fmt, entries...)
 	}
-	l.Flush()
 }
 
 func (l *clientLogger) getCaller(depth int) string {
-	_, file, line, ok := runtime.Caller(depth + 4)
+	_, file, line, ok := runtime.Caller(depth + 1)
 	if !ok {
 		return "???"
 	}
@@ -48,42 +49,55 @@ func (l *clientLogger) getCaller(depth int) string {
 }
 
 func (l *clientLogger) Flush() {
+	log.Default().Sync()
+}
+
+func (l *clientLogger) Debug(args ...interface{}) {
+	log.Default().Debug(fmt.Sprint(args...))
+}
+
+func (l *clientLogger) Debugln(args ...interface{}) {
+	log.Default().Debug(fmt.Sprint(args...))
+}
+
+func (l *clientLogger) Debugf(format string, args ...interface{}) {
+	log.Default().Debugf(format, args...)
 }
 
 func (l *clientLogger) Info(args ...interface{}) {
-	util.Logger().Info(fmt.Sprint(args...))
+	log.Default().Info(fmt.Sprint(args...))
 }
 
 func (l *clientLogger) Infoln(args ...interface{}) {
-	util.Logger().Info(fmt.Sprint(args...))
+	log.Default().Info(fmt.Sprint(args...))
 }
 
 func (l *clientLogger) Infof(format string, args ...interface{}) {
-	util.Logger().Infof(format, args...)
+	log.Default().Infof(format, args...)
 }
 
 func (l *clientLogger) Warning(args ...interface{}) {
-	util.Logger().Warn(fmt.Sprint(args...), nil)
+	log.Default().Warn(fmt.Sprint(args...))
 }
 
 func (l *clientLogger) Warningln(args ...interface{}) {
-	util.Logger().Warn(fmt.Sprint(args...), nil)
+	log.Default().Warn(fmt.Sprint(args...))
 }
 
 func (l *clientLogger) Warningf(format string, args ...interface{}) {
-	util.Logger().Warnf(format, args...)
+	log.Default().Warnf(format, args...)
 }
 
 func (l *clientLogger) Error(args ...interface{}) {
-	util.Logger().Error(fmt.Sprint(args...), nil)
+	log.Default().Error(fmt.Sprint(args...), nil)
 }
 
 func (l *clientLogger) Errorln(args ...interface{}) {
-	util.Logger().Error(fmt.Sprint(args...), nil)
+	log.Default().Error(fmt.Sprint(args...), nil)
 }
 
 func (l *clientLogger) Errorf(format string, args ...interface{}) {
-	util.Logger().Errorf(nil, format, args...)
+	log.Default().Errorf(nil, format, args...)
 }
 
 // V reports whether verbosity level l is at least the requested verbose level.
@@ -92,25 +106,25 @@ func (l *clientLogger) V(_ int) bool {
 }
 
 func (l *clientLogger) Fatal(args ...interface{}) {
-	util.Logger().Fatal(fmt.Sprint(args...), nil)
+	log.Default().Fatal(fmt.Sprint(args...), nil)
 }
 
 func (l *clientLogger) Fatalf(format string, args ...interface{}) {
-	util.Logger().Fatalf(nil, format, args...)
+	log.Default().Fatalf(nil, format, args...)
 }
 
 func (l *clientLogger) Fatalln(args ...interface{}) {
-	util.Logger().Fatal(fmt.Sprint(args...), nil)
+	log.Default().Fatal(fmt.Sprint(args...), nil)
 }
 
 func (l *clientLogger) Print(args ...interface{}) {
-	util.Logger().Error(fmt.Sprint(args...), nil)
+	log.Default().Error(fmt.Sprint(args...), nil)
 }
 
 func (l *clientLogger) Printf(format string, args ...interface{}) {
-	util.Logger().Errorf(nil, format, args...)
+	log.Default().Errorf(nil, format, args...)
 }
 
 func (l *clientLogger) Println(args ...interface{}) {
-	util.Logger().Error(fmt.Sprint(args...), nil)
+	log.Default().Error(fmt.Sprint(args...), nil)
 }
diff --git a/server/plugin/infra/tls/buildin/tls.go b/server/plugin/infra/tls/buildin/tls.go
index 67ae48a..037695f 100644
--- a/server/plugin/infra/tls/buildin/tls.go
+++ b/server/plugin/infra/tls/buildin/tls.go
@@ -18,6 +18,7 @@ package buildin
 
 import (
 	"crypto/tls"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/tlsutil"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
@@ -47,14 +48,14 @@ func GetSSLPath(path string) string {
 func GetPassphase() (pass string, decrypt string) {
 	passphase, err := ioutil.ReadFile(GetSSLPath("cert_pwd"))
 	if err != nil {
-		util.Logger().Errorf(err, "read file cert_pwd failed.")
+		log.Errorf(err, "read file cert_pwd failed.")
 	}
 
 	pass = util.BytesToStringWithNoCopy(passphase)
 	if len(pass) > 0 {
 		decrypt, err = plugin.Plugins().Cipher().Decrypt(pass)
 		if err != nil {
-			util.Logger().Errorf(err, "decrypt ssl passphase(%d) failed.", len(pass))
+			log.Errorf(err, "decrypt ssl passphase(%d) failed.", len(pass))
 			decrypt = ""
 		}
 	}
@@ -86,7 +87,7 @@ func GetClientTLSConfig() (_ *tls.Config, err error) {
 	clientTLSConfig, err = tlsutil.GetClientTLSConfig(opts...)
 
 	if clientTLSConfig != nil {
-		util.Logger().Infof("client ssl configs enabled, verifyclient %t, minv %#x, cipers %d, pphase %d.",
+		log.Infof("client ssl configs enabled, verifyclient %t, minv %#x, cipers %d, pphase %d.",
 			core.ServerInfo.Config.SslVerifyPeer,
 			clientTLSConfig.MinVersion,
 			len(clientTLSConfig.CipherSuites),
@@ -117,7 +118,7 @@ func GetServerTLSConfig() (_ *tls.Config, err error) {
 	serverTLSConfig, err = tlsutil.GetServerTLSConfig(opts...)
 
 	if serverTLSConfig != nil {
-		util.Logger().Infof("server ssl configs enabled, verifyClient %t, minv %#x, ciphers %d, phase %d.",
+		log.Infof("server ssl configs enabled, verifyClient %t, minv %#x, ciphers %d, phase %d.",
 			core.ServerInfo.Config.SslVerifyPeer,
 			serverTLSConfig.MinVersion,
 			len(serverTLSConfig.CipherSuites),
diff --git a/server/plugin/infra/tracing/buildin/buildin.go b/server/plugin/infra/tracing/buildin/buildin.go
index 12753b4..6ffc09d 100644
--- a/server/plugin/infra/tracing/buildin/buildin.go
+++ b/server/plugin/infra/tracing/buildin/buildin.go
@@ -18,6 +18,7 @@ package buildin
 
 import (
 	"context"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/tracing"
 	mgr "github.com/apache/incubator-servicecomb-service-center/server/plugin"
@@ -57,7 +58,7 @@ func (zp *Zipkin) ServerBegin(operationName string, itf tracing.Request) tracing
 		case nil:
 		case opentracing.ErrSpanContextNotFound:
 		default:
-			util.Logger().Errorf(err, "tracer extract request failed")
+			log.Errorf(err, "tracer extract request failed")
 			return nil
 		}
 
@@ -116,7 +117,7 @@ func (zp *Zipkin) ClientBegin(operationName string, itf tracing.Request) tracing
 			opentracing.HTTPHeaders,
 			carrier,
 		); err != nil {
-			util.Logger().Errorf(err, "tracer inject request failed")
+			log.Errorf(err, "tracer inject request failed")
 		}
 	case *tracing.RegistryRequest:
 		r := itf.(*tracing.RegistryRequest)
@@ -144,7 +145,7 @@ func (zp *Zipkin) ClientBegin(operationName string, itf tracing.Request) tracing
 			opentracing.HTTPHeaders,
 			carrier,
 		); err != nil {
-			util.Logger().Errorf(err, "tracer inject request failed")
+			log.Errorf(err, "tracer inject request failed")
 		}
 		// inject context
 		carrier.ForeachKey(func(key, val string) error {
diff --git a/server/plugin/infra/tracing/buildin/common.go b/server/plugin/infra/tracing/buildin/common.go
index 14e30f7..64f410f 100644
--- a/server/plugin/infra/tracing/buildin/common.go
+++ b/server/plugin/infra/tracing/buildin/common.go
@@ -18,7 +18,7 @@ package buildin
 
 import (
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/metric"
 	"github.com/opentracing/opentracing-go"
@@ -31,14 +31,14 @@ import (
 func initTracer() {
 	collector, err := newCollector()
 	if err != nil {
-		util.Logger().Errorf(err, "new tracing collector failed, use the noop tracer")
+		log.Errorf(err, "new tracing collector failed, use the noop tracer")
 		return
 	}
 	ipPort := metric.InstanceName()
 	recorder := zipkin.NewRecorder(collector, false, ipPort, strings.ToLower(core.Service.ServiceName))
 	tracer, err := zipkin.NewTracer(recorder, zipkin.TraceID128Bit(true))
 	if err != nil {
-		util.Logger().Errorf(err, "new tracer failed")
+		log.Errorf(err, "new tracer failed")
 		return
 	}
 	opentracing.SetGlobalTracer(tracer)
diff --git a/server/plugin/infra/tracing/buildin/file_collector.go b/server/plugin/infra/tracing/buildin/file_collector.go
index 4de5588..e0a45fe 100644
--- a/server/plugin/infra/tracing/buildin/file_collector.go
+++ b/server/plugin/infra/tracing/buildin/file_collector.go
@@ -20,6 +20,8 @@ import (
 	"bufio"
 	"encoding/json"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
@@ -35,7 +37,7 @@ type FileCollector struct {
 	Interval  time.Duration
 	BatchSize int
 	c         chan *zipkincore.Span
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 }
 
 func (f *FileCollector) Collect(span *zipkincore.Span) error {
@@ -48,7 +50,7 @@ func (f *FileCollector) Collect(span *zipkincore.Span) error {
 	case f.c <- span:
 		timer.Stop()
 	case <-timer.C:
-		util.Logger().Errorf(nil, "send span to handle channel timed out(%s)", f.Timeout)
+		log.Errorf(nil, "send span to handle channel timed out(%s)", f.Timeout)
 	}
 	return nil
 }
@@ -64,7 +66,7 @@ func (f *FileCollector) write(batch []*zipkincore.Span) (c int) {
 	}
 
 	if err := f.checkFile(); err != nil {
-		util.Logger().Errorf(err, "check tracing file failed")
+		log.Errorf(err, "check tracing file failed")
 		return
 	}
 
@@ -74,7 +76,7 @@ func (f *FileCollector) write(batch []*zipkincore.Span) (c int) {
 		s := FromZipkinSpan(span)
 		b, err := json.Marshal(s)
 		if err != nil {
-			util.Logger().Errorf(err, "marshal span failed")
+			log.Errorf(err, "marshal span failed")
 			continue
 		}
 		w.Write(b)
@@ -83,7 +85,7 @@ func (f *FileCollector) write(batch []*zipkincore.Span) (c int) {
 	}
 	if err := w.Flush(); err != nil {
 		c = 0
-		util.Logger().Errorf(err, "write span to file failed")
+		log.Errorf(err, "write span to file failed")
 	}
 	return
 }
@@ -98,7 +100,7 @@ func (f *FileCollector) checkFile() error {
 		return fmt.Errorf("stat %s: %s", f.Fd.Name(), err)
 	}
 
-	util.Logger().Warnf("tracing file %s does not exist, re-create one", f.Fd.Name())
+	log.Warnf("tracing file %s does not exist, re-create one", f.Fd.Name())
 	fd, err := os.OpenFile(f.Fd.Name(), os.O_APPEND|os.O_CREATE|os.O_RDWR, stat.Mode())
 	if err != nil {
 		return fmt.Errorf("open %s: %s", f.Fd.Name(), err)
@@ -107,7 +109,7 @@ func (f *FileCollector) checkFile() error {
 	var old *os.File
 	f.Fd, old = fd, f.Fd
 	if err := old.Close(); err != nil {
-		util.Logger().Errorf(err, "close %s", f.Fd.Name())
+		log.Errorf(err, "close %s", f.Fd.Name())
 	}
 	return nil
 }
@@ -131,7 +133,7 @@ func (f *FileCollector) Run() {
 				l := len(batch)
 				if l >= max {
 					dispose := l - f.BatchSize
-					util.Logger().Errorf(nil, "backlog is full, dispose %d span(s), max: %d",
+					log.Errorf(nil, "backlog is full, dispose %d span(s), max: %d",
 						dispose, max)
 					batch = batch[dispose:] // allocate more
 				}
@@ -154,7 +156,7 @@ func (f *FileCollector) Run() {
 				}
 			case <-t.C:
 				if time.Now().After(nr) {
-					util.LogRotateFile(f.Fd.Name(),
+					log.LogRotateFile(f.Fd.Name(),
 						int(core.ServerInfo.Config.LogRotateSize),
 						int(core.ServerInfo.Config.LogBackupCount),
 					)
@@ -180,7 +182,7 @@ func NewFileCollector(path string) (*FileCollector, error) {
 		Interval:  10 * time.Second,
 		BatchSize: 100,
 		c:         make(chan *zipkincore.Span, 1000),
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 	fc.Run()
 	return fc, nil
diff --git a/server/plugin/infra/tracing/buildin/file_collector_test.go b/server/plugin/infra/tracing/buildin/file_collector_test.go
index c7fd087..c5cd6b9 100644
--- a/server/plugin/infra/tracing/buildin/file_collector_test.go
+++ b/server/plugin/infra/tracing/buildin/file_collector_test.go
@@ -18,7 +18,7 @@ package buildin
 
 import (
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
 	"golang.org/x/net/context"
 	"os"
@@ -34,7 +34,7 @@ func TestFileCollector_Collect(t *testing.T) {
 		Interval:  1 * time.Second,
 		BatchSize: 2,
 		c:         make(chan *zipkincore.Span, 100),
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 	fc.Run()
 
diff --git a/server/plugin/plugin.go b/server/plugin/plugin.go
index e4eb804..9627f79 100644
--- a/server/plugin/plugin.go
+++ b/server/plugin/plugin.go
@@ -17,6 +17,7 @@
 package plugin
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/plugin"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/auditlog"
@@ -117,7 +118,7 @@ func (pm *PluginManager) Register(p Plugin) {
 	}
 	m[p.Name] = &p
 	pm.plugins[p.PName] = m
-	util.Logger().Infof("load '%s' plugin named '%s'", p.PName, p.Name)
+	log.Infof("load '%s' plugin named '%s'", p.PName, p.Name)
 }
 
 func (pm *PluginManager) Get(pn PluginName, name string) *Plugin {
@@ -175,7 +176,7 @@ func (pm *PluginManager) New(pn PluginName) {
 
 		f = p.New
 	}
-	util.Logger().Infof("call %s '%s' plugin %s(), new a '%s' instance",
+	log.Infof("call %s '%s' plugin %s(), new a '%s' instance",
 		title, p.PName, util.FuncName(f), p.Name)
 
 	wi.instance = f()
@@ -229,7 +230,7 @@ func DynamicPluginFunc(pn PluginName, funcName string) pg.Symbol {
 
 	f, err := plugin.FindFunc(pn.String(), funcName)
 	if err != nil {
-		util.Logger().Errorf(err, "plugin '%s': not implemented function '%s'.", pn, funcName)
+		log.Errorf(err, "plugin '%s': not implemented function '%s'.", pn, funcName)
 	}
 	return f
 }
diff --git a/server/rest/controller/v4/dependency_controller.go b/server/rest/controller/v4/dependency_controller.go
index 2d3b601..277edf2 100644
--- a/server/rest/controller/v4/dependency_controller.go
+++ b/server/rest/controller/v4/dependency_controller.go
@@ -18,8 +18,8 @@ package v4
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -44,14 +44,14 @@ func (this *DependencyService) URLPatterns() []rest.Route {
 func (this *DependencyService) AddDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
 	requestBody, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
 	request := &pb.AddDependenciesRequest{}
 	err = json.Unmarshal(requestBody, request)
 	if err != nil {
-		util.Logger().Error("Invalid json", err)
+		log.Error("Invalid json", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -63,14 +63,14 @@ func (this *DependencyService) AddDependenciesForMicroServices(w http.ResponseWr
 func (this *DependencyService) CreateDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
 	requestBody, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
 	request := &pb.CreateDependenciesRequest{}
 	err = json.Unmarshal(requestBody, request)
 	if err != nil {
-		util.Logger().Error("Invalid json", err)
+		log.Error("Invalid json", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
diff --git a/server/rest/controller/v4/instance_controller.go b/server/rest/controller/v4/instance_controller.go
index 288b049..85bfb26 100644
--- a/server/rest/controller/v4/instance_controller.go
+++ b/server/rest/controller/v4/instance_controller.go
@@ -18,6 +18,7 @@ package v4
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
@@ -50,7 +51,7 @@ func (this *MicroServiceInstanceService) URLPatterns() []rest.Route {
 func (this *MicroServiceInstanceService) RegisterInstance(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("register instance failed, body err", err)
+		log.Error("register instance failed, body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -58,7 +59,7 @@ func (this *MicroServiceInstanceService) RegisterInstance(w http.ResponseWriter,
 	request := &pb.RegisterInstanceRequest{}
 	err = json.Unmarshal(message, request)
 	if err != nil {
-		util.Logger().Error("register instance failed, Unmarshal error", err)
+		log.Error("register instance failed, Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
 		return
 	}
@@ -86,7 +87,7 @@ func (this *MicroServiceInstanceService) Heartbeat(w http.ResponseWriter, r *htt
 func (this *MicroServiceInstanceService) HeartbeatSet(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("register instance failed, body err", err)
+		log.Error("register instance failed, body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -94,7 +95,7 @@ func (this *MicroServiceInstanceService) HeartbeatSet(w http.ResponseWriter, r *
 	request := &pb.HeartbeatSetRequest{}
 	err = json.Unmarshal(message, request)
 	if err != nil {
-		util.Logger().Error("register instance failed, Unmarshal error", err)
+		log.Error("register instance failed, Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
 		return
 	}
@@ -205,7 +206,7 @@ func (this *MicroServiceInstanceService) UpdateMetadata(w http.ResponseWriter, r
 	query := r.URL.Query()
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -215,7 +216,7 @@ func (this *MicroServiceInstanceService) UpdateMetadata(w http.ResponseWriter, r
 	}
 	err = json.Unmarshal(message, request)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, "Unmarshal error")
 		return
 	}
diff --git a/server/rest/controller/v4/instance_watcher.go b/server/rest/controller/v4/instance_watcher.go
index 9206df9..4495226 100644
--- a/server/rest/controller/v4/instance_watcher.go
+++ b/server/rest/controller/v4/instance_watcher.go
@@ -17,8 +17,8 @@
 package v4
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"github.com/gorilla/websocket"
@@ -47,7 +47,7 @@ func upgrade(w http.ResponseWriter, r *http.Request) (*websocket.Conn, error) {
 	}
 	conn, err := upgrader.Upgrade(w, r, nil)
 	if err != nil {
-		util.Logger().Error("upgrade failed.", err)
+		log.Error("upgrade failed.", err)
 		// controller.WriteError(w, scerr.ErrInternal, "Upgrade error")
 	}
 	return conn, err
diff --git a/server/rest/controller/v4/microservice_controller.go b/server/rest/controller/v4/microservice_controller.go
index 60b4d7c..9cc450a 100644
--- a/server/rest/controller/v4/microservice_controller.go
+++ b/server/rest/controller/v4/microservice_controller.go
@@ -18,8 +18,8 @@ package v4
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -49,14 +49,14 @@ func (this *MicroServiceService) URLPatterns() []rest.Route {
 func (this *MicroServiceService) Register(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
 	var request pb.CreateServiceRequest
 	err = json.Unmarshal(message, &request)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -69,7 +69,7 @@ func (this *MicroServiceService) Register(w http.ResponseWriter, r *http.Request
 func (this *MicroServiceService) Update(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -78,7 +78,7 @@ func (this *MicroServiceService) Update(w http.ResponseWriter, r *http.Request)
 	}
 	err = json.Unmarshal(message, request)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -145,7 +145,7 @@ func (this *MicroServiceService) GetServiceOne(w http.ResponseWriter, r *http.Re
 func (this *MicroServiceService) UnregisterServices(w http.ResponseWriter, r *http.Request) {
 	request_body, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body ,err", err)
+		log.Error("body ,err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -154,7 +154,7 @@ func (this *MicroServiceService) UnregisterServices(w http.ResponseWriter, r *ht
 
 	err = json.Unmarshal(request_body, request)
 	if err != nil {
-		util.Logger().Error("unmarshal ,err ", err)
+		log.Error("unmarshal ,err ", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
diff --git a/server/rest/controller/v4/query_rule_controller.go b/server/rest/controller/v4/query_rule_controller.go
index 539ce4d..1370ed7 100644
--- a/server/rest/controller/v4/query_rule_controller.go
+++ b/server/rest/controller/v4/query_rule_controller.go
@@ -18,8 +18,8 @@ package v4
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -44,14 +44,14 @@ func (this *RuleService) URLPatterns() []rest.Route {
 func (this *RuleService) AddRule(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("bory err", err)
+		log.Error("bory err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
 	rule := map[string][]*pb.AddOrUpdateServiceRule{}
 	err = json.Unmarshal(message, &rule)
 	if err != nil {
-		util.Logger().Errorf(err, "Unmarshal error")
+		log.Errorf(err, "Unmarshal error")
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -80,7 +80,7 @@ func (this *RuleService) DeleteRule(w http.ResponseWriter, r *http.Request) {
 func (this *RuleService) UpdateRule(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -88,7 +88,7 @@ func (this *RuleService) UpdateRule(w http.ResponseWriter, r *http.Request) {
 	rule := pb.AddOrUpdateServiceRule{}
 	err = json.Unmarshal(message, &rule)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
diff --git a/server/rest/controller/v4/schema_controller.go b/server/rest/controller/v4/schema_controller.go
index 71e4cde..6292c63 100644
--- a/server/rest/controller/v4/schema_controller.go
+++ b/server/rest/controller/v4/schema_controller.go
@@ -18,8 +18,8 @@ package v4
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -60,7 +60,7 @@ func (this *SchemaService) GetSchemas(w http.ResponseWriter, r *http.Request) {
 func (this *SchemaService) ModifySchema(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -68,7 +68,7 @@ func (this *SchemaService) ModifySchema(w http.ResponseWriter, r *http.Request)
 	request := &pb.ModifySchemaRequest{}
 	err = json.Unmarshal(message, request)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -82,7 +82,7 @@ func (this *SchemaService) ModifySchema(w http.ResponseWriter, r *http.Request)
 func (this *SchemaService) ModifySchemas(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
@@ -90,7 +90,7 @@ func (this *SchemaService) ModifySchemas(w http.ResponseWriter, r *http.Request)
 	request := &pb.ModifySchemasRequest{}
 	err = json.Unmarshal(message, request)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
diff --git a/server/rest/controller/v4/tag_controller.go b/server/rest/controller/v4/tag_controller.go
index 7170498..d32d6e5 100644
--- a/server/rest/controller/v4/tag_controller.go
+++ b/server/rest/controller/v4/tag_controller.go
@@ -18,8 +18,8 @@ package v4
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rest"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	scerr "github.com/apache/incubator-servicecomb-service-center/server/error"
@@ -45,14 +45,14 @@ func (this *TagService) URLPatterns() []rest.Route {
 func (this *TagService) AddTags(w http.ResponseWriter, r *http.Request) {
 	message, err := ioutil.ReadAll(r.Body)
 	if err != nil {
-		util.Logger().Error("body err", err)
+		log.Error("body err", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
 	var tags map[string]map[string]string
 	err = json.Unmarshal(message, &tags)
 	if err != nil {
-		util.Logger().Error("Unmarshal error", err)
+		log.Error("Unmarshal error", err)
 		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
 		return
 	}
diff --git a/server/rest/server_mux.go b/server/rest/server_mux.go
index ec5bb48..49115f2 100644
--- a/server/rest/server_mux.go
+++ b/server/rest/server_mux.go
@@ -17,6 +17,7 @@
 package rest
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"net/http"
 )
@@ -45,7 +46,7 @@ func RegisterServeMux(name string) {
 func RegisterServeMuxHandleFunc(name, pattern string, f http.HandlerFunc) {
 	serveMuxMap[name].HandleFunc(pattern, f)
 
-	util.Logger().Infof("register serve mux '%s' http handle function %s(), pattern %s",
+	log.Infof("register serve mux '%s' http handle function %s(), pattern %s",
 		name, util.FuncName(f), pattern)
 }
 
@@ -53,7 +54,7 @@ func RegisterServeMuxHandler(name, pattern string, h http.Handler) {
 	serveMuxMap[name].Handle(pattern, h)
 
 	t := util.Reflect(h).Type
-	util.Logger().Infof("register serve mux '%s' http handler %s/%s, pattern %s",
+	log.Infof("register serve mux '%s' http handler %s/%s, pattern %s",
 		name, t.PkgPath(), t.Name(), pattern)
 }
 
diff --git a/server/rpc/server.go b/server/rpc/server.go
index ae7ef96..40ced00 100644
--- a/server/rpc/server.go
+++ b/server/rpc/server.go
@@ -17,8 +17,8 @@
 package rpc
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/rpc"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/plugin"
 	"google.golang.org/grpc"
@@ -40,7 +40,7 @@ func NewServer(ipAddr string) (_ *Server, err error) {
 	if core.ServerInfo.Config.SslEnabled {
 		tlsConfig, err := plugin.Plugins().TLS().ServerConfig()
 		if err != nil {
-			util.Logger().Error("error to get server tls config", err)
+			log.Error("error to get server tls config", err)
 			return nil, err
 		}
 		creds := credentials.NewTLS(tlsConfig)
@@ -53,7 +53,7 @@ func NewServer(ipAddr string) (_ *Server, err error) {
 
 	ls, err := net.Listen("tcp", ipAddr)
 	if err != nil {
-		util.Logger().Error("error to start Grpc API server "+ipAddr, err)
+		log.Error("error to start Grpc API server "+ipAddr, err)
 		return
 	}
 
diff --git a/server/server.go b/server/server.go
index fec8d08..f8048d0 100644
--- a/server/server.go
+++ b/server/server.go
@@ -19,7 +19,8 @@ package server
 import _ "github.com/apache/incubator-servicecomb-service-center/server/service/event"
 import (
 	"fmt"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	"github.com/apache/incubator-servicecomb-service-center/server/mux"
@@ -36,7 +37,7 @@ type ServiceCenterServer struct {
 	apiServer     *APIServer
 	notifyService *nf.NotifyService
 	store         *backend.KvStore
-	goroutine     *util.GoRoutine
+	goroutine     *gopool.Pool
 }
 
 func (s *ServiceCenterServer) Run() {
@@ -56,7 +57,7 @@ func (s *ServiceCenterServer) waitForQuit() {
 	case err = <-s.notifyService.Err():
 	}
 	if err != nil {
-		util.Logger().Errorf(err, "service center catch errors")
+		log.Errorf(err, "service center catch errors")
 	}
 
 	s.Stop()
@@ -65,14 +66,14 @@ func (s *ServiceCenterServer) waitForQuit() {
 func (s *ServiceCenterServer) needUpgrade() bool {
 	err := LoadServerVersion()
 	if err != nil {
-		util.Logger().Errorf(err, "check version failed, can not load the system config")
+		log.Errorf(err, "check version failed, can not load the system config")
 		return false
 	}
 
 	update := !serviceUtil.VersionMatchRule(core.ServerInfo.Version,
 		fmt.Sprintf("%s+", version.Ver().Version))
 	if !update && version.Ver().Version != core.ServerInfo.Version {
-		util.Logger().Warnf(
+		log.Warnf(
 			"there is a higher version '%s' in cluster, now running '%s' version may be incompatible",
 			core.ServerInfo.Version, version.Ver().Version)
 	}
@@ -83,7 +84,7 @@ func (s *ServiceCenterServer) needUpgrade() bool {
 func (s *ServiceCenterServer) loadOrUpgradeServerVersion() {
 	lock, err := mux.Lock(mux.GLOBAL_LOCK)
 	if err != nil {
-		util.Logger().Errorf(err, "wait for server ready failed")
+		log.Errorf(err, "wait for server ready failed")
 		os.Exit(1)
 	}
 	if s.needUpgrade() {
@@ -98,7 +99,7 @@ func (s *ServiceCenterServer) initialize() {
 	s.store = backend.Store()
 	s.notifyService = nf.GetNotifyService()
 	s.apiServer = GetAPIServer()
-	s.goroutine = util.NewGo(context.Background())
+	s.goroutine = gopool.New(context.Background())
 
 	// check version
 	s.loadOrUpgradeServerVersion()
@@ -118,11 +119,11 @@ func (s *ServiceCenterServer) autoCompactBackend() {
 	}
 	interval, err := time.ParseDuration(core.ServerInfo.Config.CompactInterval)
 	if err != nil {
-		util.Logger().Errorf(err, "invalid compact interval %s, reset to default interval 12h", core.ServerInfo.Config.CompactInterval)
+		log.Errorf(err, "invalid compact interval %s, reset to default interval 12h", core.ServerInfo.Config.CompactInterval)
 		interval = 12 * time.Hour
 	}
 	s.goroutine.Do(func(ctx context.Context) {
-		util.Logger().Infof("enabled the automatic compact mechanism, compact once every %s, reserve %d",
+		log.Infof("enabled the automatic compact mechanism, compact once every %s, reserve %d",
 			core.ServerInfo.Config.CompactInterval, delta)
 		for {
 			select {
@@ -131,7 +132,7 @@ func (s *ServiceCenterServer) autoCompactBackend() {
 			case <-time.After(interval):
 				lock, err := mux.Try(mux.GLOBAL_LOCK)
 				if lock == nil {
-					util.Logger().Errorf(err, "can not compact backend by this service center instance now")
+					log.Errorf(err, "can not compact backend by this service center instance now")
 					continue
 				}
 
@@ -156,7 +157,7 @@ func (s *ServiceCenterServer) startApiServer() {
 	host, err := os.Hostname()
 	if err != nil {
 		host = restIp
-		util.Logger().Errorf(err, "parse hostname failed")
+		log.Errorf(err, "parse hostname failed")
 	}
 	s.apiServer.HostName = host
 	s.apiServer.AddListener(REST, restIp, restPort)
@@ -179,9 +180,10 @@ func (s *ServiceCenterServer) Stop() {
 
 	s.goroutine.Close(true)
 
-	util.GoCloseAndWait()
+	gopool.CloseAndWait()
 
 	backend.Registry().Close()
 
-	util.Logger().Warnf("service center stopped")
+	log.Warnf("service center stopped")
+	log.Sync()
 }
diff --git a/server/service/cache/filter_instances.go b/server/service/cache/filter_instances.go
index 1c38676..d82583b 100644
--- a/server/service/cache/filter_instances.go
+++ b/server/service/cache/filter_instances.go
@@ -19,7 +19,7 @@ package cache
 import (
 	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/cache"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
@@ -51,7 +51,7 @@ func (f *InstancesFilter) Init(ctx context.Context, parent *cache.Node) (node *c
 			consumer := ctx.Value(CTX_FIND_CONSUMER).(*pb.MicroService)
 			findFlag := fmt.Sprintf("consumer %s find provider %s/%s/%s", consumer.ServiceId,
 				provider.AppId, provider.ServiceName, provider.Version)
-			util.Logger().Errorf(err, "Instance().Search failed, %s", findFlag)
+			log.Errorf(err, "Instance().Search failed, %s", findFlag)
 			return nil, err
 		}
 
diff --git a/server/service/cache/filter_permission.go b/server/service/cache/filter_permission.go
index ef85944..3beae37 100644
--- a/server/service/cache/filter_permission.go
+++ b/server/service/cache/filter_permission.go
@@ -19,7 +19,7 @@ package cache
 import (
 	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/cache"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	serviceUtil "github.com/apache/incubator-servicecomb-service-center/server/service/util"
 	"golang.org/x/net/context"
@@ -42,7 +42,7 @@ func (f *AccessibleFilter) Init(ctx context.Context, parent *cache.Node) (node *
 			provider := ctx.Value(CTX_FIND_PROVIDER).(*pb.MicroServiceKey)
 			findFlag := fmt.Sprintf("consumer %s find provider %s/%s/%s", consumerId,
 				provider.AppId, provider.ServiceName, provider.Version)
-			util.Logger().Errorf(err, "AccessibleFilter failed, %s", findFlag)
+			log.Errorf(err, "AccessibleFilter failed, %s", findFlag)
 			continue
 		}
 		ids = append(ids, providerServiceId)
diff --git a/server/service/cache/filter_tags.go b/server/service/cache/filter_tags.go
index da418c8..5139db1 100644
--- a/server/service/cache/filter_tags.go
+++ b/server/service/cache/filter_tags.go
@@ -19,6 +19,7 @@ package cache
 import (
 	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/cache"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	serviceUtil "github.com/apache/incubator-servicecomb-service-center/server/service/util"
@@ -57,7 +58,7 @@ loopProviderIds:
 			provider := ctx.Value(CTX_FIND_PROVIDER).(*pb.MicroServiceKey)
 			findFlag := fmt.Sprintf("consumer %s find provider %s/%s/%s", consumer.ServiceId,
 				provider.AppId, provider.ServiceName, provider.Version)
-			util.Logger().Errorf(err, "TagsFilter failed, %s", findFlag)
+			log.Errorf(err, "TagsFilter failed, %s", findFlag)
 			return nil, err
 		}
 		if len(tagsFromETCD) == 0 {
diff --git a/server/service/cache/filter_version.go b/server/service/cache/filter_version.go
index df9da3d..b65d0ca 100644
--- a/server/service/cache/filter_version.go
+++ b/server/service/cache/filter_version.go
@@ -19,7 +19,7 @@ package cache
 import (
 	"fmt"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/cache"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	serviceUtil "github.com/apache/incubator-servicecomb-service-center/server/service/util"
 	"golang.org/x/net/context"
@@ -41,7 +41,7 @@ func (f *VersionRuleFilter) Init(ctx context.Context, parent *cache.Node) (node
 		consumer := ctx.Value(CTX_FIND_CONSUMER).(*pb.MicroService)
 		findFlag := fmt.Sprintf("consumer %s find provider %s/%s/%s", consumer.ServiceId,
 			provider.AppId, provider.ServiceName, provider.Version)
-		util.Logger().Errorf(err, "VersionRuleFilter failed, %s", findFlag)
+		log.Errorf(err, "VersionRuleFilter failed, %s", findFlag)
 		return
 	}
 	if !exist {
diff --git a/server/service/dependency.go b/server/service/dependency.go
index 4c13dd0..31beb92 100644
--- a/server/service/dependency.go
+++ b/server/service/dependency.go
@@ -19,6 +19,7 @@ package service
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -65,19 +66,19 @@ func (s *MicroServiceService) AddOrUpdateDependencies(ctx context.Context, depen
 
 		rsp := serviceUtil.ParamsChecker(consumerInfo, providersInfo)
 		if rsp != nil {
-			util.Logger().Errorf(nil, "put request into dependency queue failed, override: %t, consumer is %s, %s",
+			log.Errorf(nil, "put request into dependency queue failed, override: %t, consumer is %s, %s",
 				override, consumerFlag, rsp.Response.Message)
 			return rsp.Response, nil
 		}
 
 		consumerId, err := serviceUtil.GetServiceId(ctx, consumerInfo)
 		if err != nil {
-			util.Logger().Errorf(err, "put request into dependency queue failed, override: %t, get consumer %s id failed",
+			log.Errorf(err, "put request into dependency queue failed, override: %t, get consumer %s id failed",
 				override, consumerFlag)
 			return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 		}
 		if len(consumerId) == 0 {
-			util.Logger().Errorf(nil, "put request into dependency queue failed, override: %t, consumer %s does not exist.",
+			log.Errorf(nil, "put request into dependency queue failed, override: %t, consumer %s does not exist.",
 				override, consumerFlag)
 			return pb.CreateResponse(scerr.ErrServiceNotExists, fmt.Sprintf("Consumer %s does not exist.", consumerFlag)), nil
 		}
@@ -85,7 +86,7 @@ func (s *MicroServiceService) AddOrUpdateDependencies(ctx context.Context, depen
 		dependencyInfo.Override = override
 		data, err := json.Marshal(dependencyInfo)
 		if err != nil {
-			util.Logger().Errorf(err, "put request into dependency queue failed, override: %t, marshal consumer %s dependency failed",
+			log.Errorf(err, "put request into dependency queue failed, override: %t, marshal consumer %s dependency failed",
 				override, consumerFlag)
 			return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 		}
@@ -100,11 +101,11 @@ func (s *MicroServiceService) AddOrUpdateDependencies(ctx context.Context, depen
 
 	err := backend.BatchCommit(ctx, opts)
 	if err != nil {
-		util.Logger().Errorf(err, "put request into dependency queue failed, override: %t, %v", override, dependencyInfos)
+		log.Errorf(err, "put request into dependency queue failed, override: %t, %v", override, dependencyInfos)
 		return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 	}
 
-	util.Logger().Infof("put request into dependency queue successfully, override: %t, %v, from remote %s",
+	log.Infof("put request into dependency queue successfully, override: %t, %v, from remote %s",
 		override, dependencyInfos, util.GetIPFromContext(ctx))
 	return pb.CreateResponse(pb.Response_SUCCESS, "Create dependency successfully."), nil
 }
@@ -112,7 +113,7 @@ func (s *MicroServiceService) AddOrUpdateDependencies(ctx context.Context, depen
 func (s *MicroServiceService) GetProviderDependencies(ctx context.Context, in *pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "GetProviderDependencies failed for validating parameters failed.")
+		log.Errorf(err, "GetProviderDependencies failed for validating parameters failed.")
 		return &pb.GetProDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -122,11 +123,11 @@ func (s *MicroServiceService) GetProviderDependencies(ctx context.Context, in *p
 
 	provider, err := serviceUtil.GetService(ctx, domainProject, providerServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "GetProviderDependencies failed, %s.", providerServiceId)
+		log.Errorf(err, "GetProviderDependencies failed, %s.", providerServiceId)
 		return nil, err
 	}
 	if provider == nil {
-		util.Logger().Errorf(err, "GetProviderDependencies failed for provider does not exist, %s.", providerServiceId)
+		log.Errorf(err, "GetProviderDependencies failed for provider does not exist, %s.", providerServiceId)
 		return &pb.GetProDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Provider does not exist"),
 		}, nil
@@ -135,7 +136,7 @@ func (s *MicroServiceService) GetProviderDependencies(ctx context.Context, in *p
 	dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, provider)
 	services, err := dr.GetDependencyConsumers(toDependencyFilterOptions(in)...)
 	if err != nil {
-		util.Logger().Errorf(err, "GetProviderDependencies failed.")
+		log.Errorf(err, "GetProviderDependencies failed.")
 		return &pb.GetProDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -149,7 +150,7 @@ func (s *MicroServiceService) GetProviderDependencies(ctx context.Context, in *p
 func (s *MicroServiceService) GetConsumerDependencies(ctx context.Context, in *pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "GetConsumerDependencies failed for validating parameters failed.")
+		log.Errorf(err, "GetConsumerDependencies failed for validating parameters failed.")
 		return &pb.GetConDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -159,13 +160,13 @@ func (s *MicroServiceService) GetConsumerDependencies(ctx context.Context, in *p
 
 	consumer, err := serviceUtil.GetService(ctx, domainProject, consumerId)
 	if err != nil {
-		util.Logger().Errorf(err, "GetConsumerDependencies failed for get consumer failed.")
+		log.Errorf(err, "GetConsumerDependencies failed for get consumer failed.")
 		return &pb.GetConDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if consumer == nil {
-		util.Logger().Errorf(err, "GetConsumerDependencies failed for consumer does not exist, %s.", consumerId)
+		log.Errorf(err, "GetConsumerDependencies failed for consumer does not exist, %s.", consumerId)
 		return &pb.GetConDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Consumer does not exist"),
 		}, nil
@@ -174,7 +175,7 @@ func (s *MicroServiceService) GetConsumerDependencies(ctx context.Context, in *p
 	dr := serviceUtil.NewConsumerDependencyRelation(ctx, domainProject, consumer)
 	services, err := dr.GetDependencyProviders(toDependencyFilterOptions(in)...)
 	if err != nil {
-		util.Logger().Errorf(err, "GetConsumerDependencies failed for get providers failed.")
+		log.Errorf(err, "GetConsumerDependencies failed for get providers failed.")
 		return &pb.GetConDependenciesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
diff --git a/server/service/event/dependency_event_handler.go b/server/service/event/dependency_event_handler.go
index 235fa02..f4552ae 100644
--- a/server/service/event/dependency_event_handler.go
+++ b/server/service/event/dependency_event_handler.go
@@ -18,6 +18,9 @@ package event
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/queue"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -30,7 +33,7 @@ import (
 )
 
 type DependencyEventHandler struct {
-	signals *util.UniQueue
+	signals *queue.UniQueue
 }
 
 func (h *DependencyEventHandler) Type() backend.StoreType {
@@ -47,7 +50,7 @@ func (h *DependencyEventHandler) OnEvent(evt backend.KvEvent) {
 }
 
 func (h *DependencyEventHandler) loop() {
-	util.Go(func(ctx context.Context) {
+	gopool.Go(func(ctx context.Context) {
 		retries := 0
 		delay := func() {
 			<-time.After(util.GetBackoff().Delay(retries))
@@ -62,7 +65,7 @@ func (h *DependencyEventHandler) loop() {
 			case <-h.signals.Chan():
 				lock, err := mux.Try(mux.DEP_QUEUE_LOCK)
 				if err != nil {
-					util.Logger().Errorf(err, "try to lock %s failed", mux.DEP_QUEUE_LOCK)
+					log.Errorf(err, "try to lock %s failed", mux.DEP_QUEUE_LOCK)
 					delay()
 					continue
 				}
@@ -75,7 +78,7 @@ func (h *DependencyEventHandler) loop() {
 				err = h.Handle()
 				lock.Unlock()
 				if err != nil {
-					util.Logger().Errorf(err, "handle dependency event failed")
+					log.Errorf(err, "handle dependency event failed")
 					delay()
 					continue
 				}
@@ -160,16 +163,16 @@ func (h *DependencyEventHandler) dependencyRuleHandle(res interface{}) error {
 	}
 
 	if err != nil {
-		util.Logger().Errorf(err, "modify dependency rule failed, override: %t, consumer %s", r.Override, consumerFlag)
+		log.Errorf(err, "modify dependency rule failed, override: %t, consumer %s", r.Override, consumerFlag)
 		return fmt.Errorf("override: %t, consumer is %s, %s", r.Override, consumerFlag, err.Error())
 	}
 
 	if err = h.removeKV(ctx, dependencyEventHandlerRes.kv); err != nil {
-		util.Logger().Errorf(err, "remove dependency rule failed, override: %t, consumer %s", r.Override, consumerFlag)
+		log.Errorf(err, "remove dependency rule failed, override: %t, consumer %s", r.Override, consumerFlag)
 		return err
 	}
 
-	util.Logger().Infof("maintain dependency %v successfully, override: %t", r, r.Override)
+	log.Infof("maintain dependency %v successfully, override: %t", r, r.Override)
 	return nil
 }
 
@@ -181,14 +184,14 @@ func (h *DependencyEventHandler) removeKV(ctx context.Context, kv *backend.KeyVa
 		return fmt.Errorf("can not remove the dependency %s request, %s", util.BytesToStringWithNoCopy(kv.Key), err.Error())
 	}
 	if !dResp.Succeeded {
-		util.Logger().Infof("the dependency %s request is changed", util.BytesToStringWithNoCopy(kv.Key))
+		log.Infof("the dependency %s request is changed", util.BytesToStringWithNoCopy(kv.Key))
 	}
 	return nil
 }
 
 func NewDependencyEventHandler() *DependencyEventHandler {
 	h := &DependencyEventHandler{
-		signals: util.NewUniQueue(),
+		signals: queue.NewUniQueue(),
 	}
 	h.loop()
 	return h
diff --git a/server/service/event/instance_event_handler.go b/server/service/event/instance_event_handler.go
index b660508..a66db69 100644
--- a/server/service/event/instance_event_handler.go
+++ b/server/service/event/instance_event_handler.go
@@ -17,6 +17,7 @@
 package event
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -58,17 +59,17 @@ func (h *InstanceEventHandler) OnEvent(evt backend.KvEvent) {
 	}
 
 	if nf.GetNotifyService().Closed() {
-		util.Logger().Warnf("caught [%s] instance event %s/%s, but notify service is closed",
+		log.Warnf("caught [%s] instance event %s/%s, but notify service is closed",
 			action, providerId, providerInstanceId)
 		return
 	}
-	util.Logger().Infof("caught [%s] instance event %s/%s", action, providerId, providerInstanceId)
+	log.Infof("caught [%s] instance event %s/%s", action, providerId, providerInstanceId)
 
 	// 查询服务版本信息
 	ctx := util.SetContext(context.Background(), serviceUtil.CTX_CACHEONLY, "1")
 	ms, err := serviceUtil.GetService(ctx, domainProject, providerId)
 	if ms == nil {
-		util.Logger().Errorf(err, "get provider service %s/%s id in cache failed",
+		log.Errorf(err, "get provider service %s/%s id in cache failed",
 			providerId, providerInstanceId)
 		return
 	}
@@ -76,7 +77,7 @@ func (h *InstanceEventHandler) OnEvent(evt backend.KvEvent) {
 	// 查询所有consumer
 	consumerIds, _, err := serviceUtil.GetAllConsumerIds(ctx, domainProject, ms)
 	if err != nil {
-		util.Logger().Errorf(err, "query service %s consumers failed", providerId)
+		log.Errorf(err, "query service %s consumers failed", providerId)
 		return
 	}
 
diff --git a/server/service/event/rule_event_handler.go b/server/service/event/rule_event_handler.go
index e2bc687..de88fc8 100644
--- a/server/service/event/rule_event_handler.go
+++ b/server/service/event/rule_event_handler.go
@@ -18,6 +18,7 @@ package event
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/task"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -54,17 +55,17 @@ func (apt *RulesChangedTask) publish(ctx context.Context, domainProject, provide
 
 	provider, err := serviceUtil.GetService(ctx, domainProject, providerId)
 	if err != nil {
-		util.Logger().Errorf(err, "get provider %s service file failed", providerId)
+		log.Errorf(err, "get provider %s service file failed", providerId)
 		return err
 	}
 	if provider == nil {
-		util.Logger().Errorf(nil, "provider %s does not exist", providerId)
+		log.Errorf(nil, "provider %s does not exist", providerId)
 		return fmt.Errorf("provider %s does not exist", providerId)
 	}
 
 	consumerIds, err := serviceUtil.GetConsumerIds(ctx, domainProject, provider)
 	if err != nil {
-		util.Logger().Errorf(err, "get consumer services by provider %s failed", providerId)
+		log.Errorf(err, "get consumer services by provider %s failed", providerId)
 		return err
 	}
 	providerKey := pb.MicroServiceToKey(domainProject, provider)
@@ -88,11 +89,11 @@ func (h *RuleEventHandler) OnEvent(evt backend.KvEvent) {
 
 	providerId, ruleId, domainProject := backend.GetInfoFromRuleKV(evt.KV)
 	if nf.GetNotifyService().Closed() {
-		util.Logger().Warnf("caught [%s] service rule event %s/%s, but notify service is closed",
+		log.Warnf("caught [%s] service rule event %s/%s, but notify service is closed",
 			action, providerId, ruleId)
 		return
 	}
-	util.Logger().Infof("caught [%s] service rule event %s/%s", action, providerId, ruleId)
+	log.Infof("caught [%s] service rule event %s/%s", action, providerId, ruleId)
 
 	task.Service().Add(context.Background(),
 		NewRulesChangedAsyncTask(domainProject, providerId, evt.Revision))
diff --git a/server/service/event/service_event_handler.go b/server/service/event/service_event_handler.go
index 613a087..dcb08f5 100644
--- a/server/service/event/service_event_handler.go
+++ b/server/service/event/service_event_handler.go
@@ -17,7 +17,7 @@
 package event
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"github.com/apache/incubator-servicecomb-service-center/server/service/cache"
@@ -47,7 +47,7 @@ func (h *ServiceEventHandler) OnEvent(evt backend.KvEvent) {
 		newProject := domainProject[strings.Index(domainProject, "/")+1:]
 		err := serviceUtil.NewDomainProject(context.Background(), newDomain, newProject)
 		if err != nil {
-			util.Logger().Errorf(err, "new domain(%s) or project(%s) failed", newDomain, newProject)
+			log.Errorf(err, "new domain(%s) or project(%s) failed", newDomain, newProject)
 		}
 	case pb.EVT_DELETE:
 		metrics.ReportServices(fn, fv, -1)
@@ -58,7 +58,7 @@ func (h *ServiceEventHandler) OnEvent(evt backend.KvEvent) {
 		return
 	}
 
-	util.Logger().Infof("caught [%s] service %s/%s/%s event",
+	log.Infof("caught [%s] service %s/%s/%s event",
 		evt.Type, ms.AppId, ms.ServiceName, ms.Version)
 
 	// cache
diff --git a/server/service/event/tag_event_handler.go b/server/service/event/tag_event_handler.go
index aecf7cb..101b224 100644
--- a/server/service/event/tag_event_handler.go
+++ b/server/service/event/tag_event_handler.go
@@ -18,6 +18,7 @@ package event
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/task"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -55,11 +56,11 @@ func (apt *TagsChangedTask) publish(ctx context.Context, domainProject, consumer
 
 	consumer, err := serviceUtil.GetService(ctx, domainProject, consumerId)
 	if err != nil {
-		util.Logger().Errorf(err, "get consumer for publish event %s failed", consumerId)
+		log.Errorf(err, "get consumer for publish event %s failed", consumerId)
 		return err
 	}
 	if consumer == nil {
-		util.Logger().Errorf(nil, "service not exist, %s", consumerId)
+		log.Errorf(nil, "service not exist, %s", consumerId)
 		return fmt.Errorf("service not exist, %s", consumerId)
 	}
 
@@ -68,14 +69,14 @@ func (apt *TagsChangedTask) publish(ctx context.Context, domainProject, consumer
 
 	providerIds, err := serviceUtil.GetProviderIds(ctx, domainProject, consumer)
 	if err != nil {
-		util.Logger().Errorf(err, "get provider services by consumer %s failed", consumerId)
+		log.Errorf(err, "get provider services by consumer %s failed", consumerId)
 		return err
 	}
 
 	for _, providerId := range providerIds {
 		provider, err := serviceUtil.GetService(ctx, domainProject, providerId)
 		if provider == nil {
-			util.Logger().Errorf(err, "get service %s file failed", providerId)
+			log.Errorf(err, "get service %s file failed", providerId)
 			continue
 		}
 		providerKey := pb.MicroServiceToKey(domainProject, provider)
@@ -101,11 +102,11 @@ func (h *TagEventHandler) OnEvent(evt backend.KvEvent) {
 	consumerId, domainProject := backend.GetInfoFromTagKV(evt.KV)
 
 	if nf.GetNotifyService().Closed() {
-		util.Logger().Warnf("caught [%s] service tags event %s/%s, but notify service is closed",
+		log.Warnf("caught [%s] service tags event %s/%s, but notify service is closed",
 			action, consumerId, evt.KV.Value)
 		return
 	}
-	util.Logger().Infof("caught [%s] service tags event %s/%s", action, consumerId, evt.KV.Value)
+	log.Infof("caught [%s] service tags event %s/%s", action, consumerId, evt.KV.Value)
 
 	task.Service().Add(context.Background(),
 		NewTagsChangedAsyncTask(domainProject, consumerId, evt.Revision))
diff --git a/server/service/instance.go b/server/service/instance.go
index fe1ef03..9e61229 100644
--- a/server/service/instance.go
+++ b/server/service/instance.go
@@ -20,6 +20,8 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -89,7 +91,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 	remoteIP := util.GetIPFromContext(ctx)
 
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(err, "register instance failed, invalid parameters, operator %s", remoteIP)
+		log.Errorf(err, "register instance failed, invalid parameters, operator %s", remoteIP)
 		return &pb.RegisterInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -101,7 +103,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 	//如果没填写 并且endpoints沒重復,則产生新的全局instance id
 	oldInstanceId, checkErr := serviceUtil.InstanceExist(ctx, in.Instance)
 	if checkErr != nil {
-		util.Logger().Errorf(checkErr, "instance existence check failed, endpoints %v, host '%s', serviceId %s, operator %s",
+		log.Errorf(checkErr, "instance existence check failed, endpoints %v, host '%s', serviceId %s, operator %s",
 			instance.Endpoints, instance.HostName, instance.ServiceId, remoteIP)
 		resp := pb.CreateResponseWithSCErr(checkErr)
 		if checkErr.InternalError() {
@@ -110,7 +112,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 		return &pb.RegisterInstanceResponse{Response: resp}, nil
 	}
 	if len(oldInstanceId) > 0 {
-		util.Logger().Infof("register instance successful, reuse service %s instance %s, operator %s",
+		log.Infof("register instance successful, reuse service %s instance %s, operator %s",
 			instance.ServiceId, oldInstanceId, remoteIP)
 		return &pb.RegisterInstanceResponse{
 			Response:   pb.CreateResponse(pb.Response_SUCCESS, "instance more exist"),
@@ -119,7 +121,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 	}
 
 	if err := s.preProcessRegisterInstance(ctx, instance); err != nil {
-		util.Logger().Errorf(err, "register instance failed, endpoints %v, host '%s', serviceId %s, operator %s",
+		log.Errorf(err, "register instance failed, endpoints %v, host '%s', serviceId %s, operator %s",
 			instance.Endpoints, instance.HostName, instance.ServiceId, remoteIP)
 		return &pb.RegisterInstanceResponse{
 			Response: pb.CreateResponseWithSCErr(err),
@@ -133,24 +135,21 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 	//先以domain/project的方式组装
 	domainProject := util.ParseDomainProject(ctx)
 
-	var reporter quota.QuotaReporter
+	var reporter *quota.ApplyQuotaResult
 	if !apt.IsSCInstance(ctx) {
 		res := quota.NewApplyQuotaResource(quota.MicroServiceInstanceQuotaType,
 			domainProject, in.Instance.ServiceId, 1)
-		rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
-		reporter = rst.Reporter
-		err := rst.Err
-		if reporter != nil {
-			defer reporter.Close()
-		}
-		if err != nil {
-			util.Logger().Errorf(err, "register instance failed, %s, operator %s",
+		reporter = plugin.Plugins().Quota().Apply4Quotas(ctx, res)
+		defer reporter.Close(ctx)
+
+		if reporter.Err != nil {
+			log.Errorf(reporter.Err, "register instance failed, %s, operator %s",
 				instanceFlag, remoteIP)
 			response := &pb.RegisterInstanceResponse{
-				Response: pb.CreateResponseWithSCErr(err),
+				Response: pb.CreateResponseWithSCErr(reporter.Err),
 			}
-			if err.InternalError() {
-				return response, err
+			if reporter.Err.InternalError() {
+				return response, reporter.Err
 			}
 			return response, nil
 		}
@@ -159,7 +158,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 	instanceId := instance.InstanceId
 	data, err := json.Marshal(instance)
 	if err != nil {
-		util.Logger().Errorf(err,
+		log.Errorf(err,
 			"register instance failed, %s, instanceId %s, operator %s",
 			instanceFlag, instanceId, remoteIP)
 		return &pb.RegisterInstanceResponse{
@@ -169,7 +168,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 
 	leaseID, err := backend.Registry().LeaseGrant(ctx, ttl)
 	if err != nil {
-		util.Logger().Errorf(err, "grant lease failed, %s, operator: %s", instanceFlag, remoteIP)
+		log.Errorf(err, "grant lease failed, %s, operator: %s", instanceFlag, remoteIP)
 		return &pb.RegisterInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
 		}, err
@@ -192,7 +191,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err,
+		log.Errorf(err,
 			"register instance failed, %s, instanceId %s, operator %s",
 			instanceFlag, instanceId, remoteIP)
 		return &pb.RegisterInstanceResponse{
@@ -200,7 +199,7 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 		}, err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(nil,
+		log.Errorf(nil,
 			"register instance failed, %s, instanceId %s, operator %s: service does not exist",
 			instanceFlag, instanceId, remoteIP)
 		return &pb.RegisterInstanceResponse{
@@ -208,14 +207,13 @@ func (s *InstanceService) Register(ctx context.Context, in *pb.RegisterInstanceR
 		}, nil
 	}
 
-	if reporter != nil {
-		if err := reporter.ReportUsedQuota(ctx); err != nil {
-			util.Logger().Errorf(err,
-				"register instance failed, %s, instanceId %s, operator %s",
-				instanceFlag, instanceId, remoteIP)
-		}
+	if err := reporter.ReportUsedQuota(ctx); err != nil {
+		log.Errorf(err,
+			"register instance failed, %s, instanceId %s, operator %s",
+			instanceFlag, instanceId, remoteIP)
 	}
-	util.Logger().Infof("register instance %s, instanceId %s, operator %s",
+
+	log.Infof("register instance %s, instanceId %s, operator %s",
 		instanceFlag, instanceId, remoteIP)
 	return &pb.RegisterInstanceResponse{
 		Response:   pb.CreateResponse(pb.Response_SUCCESS, "Register service instance successfully."),
@@ -227,7 +225,7 @@ func (s *InstanceService) Unregister(ctx context.Context, in *pb.UnregisterInsta
 	remoteIP := util.GetIPFromContext(ctx)
 
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(err, "unregister instance failed, invalid parameters, operator %s.", remoteIP)
+		log.Errorf(err, "unregister instance failed, invalid parameters, operator %s.", remoteIP)
 		return &pb.UnregisterInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -241,13 +239,13 @@ func (s *InstanceService) Unregister(ctx context.Context, in *pb.UnregisterInsta
 
 	isExist, err := serviceUtil.InstanceExistById(ctx, domainProject, serviceId, instanceId)
 	if err != nil {
-		util.Logger().Errorf(err, "unregister instance failed, instance %s, operator %s: query instance failed.", instanceFlag, remoteIP)
+		log.Errorf(err, "unregister instance failed, instance %s, operator %s: query instance failed.", instanceFlag, remoteIP)
 		return &pb.UnregisterInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if !isExist {
-		util.Logger().Errorf(nil, "unregister instance failed, instance %s, operator %s: instance not exist.", instanceFlag, remoteIP)
+		log.Errorf(nil, "unregister instance failed, instance %s, operator %s: instance not exist.", instanceFlag, remoteIP)
 		return &pb.UnregisterInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInstanceNotExists, "Service instance does not exist."),
 		}, nil
@@ -255,7 +253,7 @@ func (s *InstanceService) Unregister(ctx context.Context, in *pb.UnregisterInsta
 
 	err, isInnerErr := revokeInstance(ctx, domainProject, serviceId, instanceId)
 	if err != nil {
-		util.Logger().Errorf(nil, "unregister instance failed, instance %s, operator %s: revoke instance failed.", instanceFlag, remoteIP)
+		log.Errorf(nil, "unregister instance failed, instance %s, operator %s: revoke instance failed.", instanceFlag, remoteIP)
 		if isInnerErr {
 			return &pb.UnregisterInstanceResponse{
 				Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
@@ -266,7 +264,7 @@ func (s *InstanceService) Unregister(ctx context.Context, in *pb.UnregisterInsta
 		}, nil
 	}
 
-	util.Logger().Infof("unregister instance %s, operator %s.", instanceFlag, remoteIP)
+	log.Infof("unregister instance %s, operator %s.", instanceFlag, remoteIP)
 	return &pb.UnregisterInstanceResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Unregister service instance successfully."),
 	}, nil
@@ -292,7 +290,7 @@ func (s *InstanceService) Heartbeat(ctx context.Context, in *pb.HeartbeatRequest
 	remoteIP := util.GetIPFromContext(ctx)
 
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(err, "heartbeat failed, invalid parameters, operator %s.", remoteIP)
+		log.Errorf(err, "heartbeat failed, invalid parameters, operator %s.", remoteIP)
 		return &pb.HeartbeatResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -303,7 +301,7 @@ func (s *InstanceService) Heartbeat(ctx context.Context, in *pb.HeartbeatRequest
 
 	_, ttl, err, isInnerErr := serviceUtil.HeartbeatUtil(ctx, domainProject, in.ServiceId, in.InstanceId)
 	if err != nil {
-		util.Logger().Errorf(err, "heartbeat failed, instance %s, internal error '%v'. operator: %s",
+		log.Errorf(err, "heartbeat failed, instance %s, internal error '%v'. operator: %s",
 			instanceFlag, isInnerErr, remoteIP)
 		if isInnerErr {
 			return &pb.HeartbeatResponse{
@@ -316,10 +314,10 @@ func (s *InstanceService) Heartbeat(ctx context.Context, in *pb.HeartbeatRequest
 	}
 
 	if ttl == 0 {
-		util.Logger().Errorf(errors.New("connect backend timed out"),
+		log.Errorf(errors.New("connect backend timed out"),
 			"heartbeat successful, but renew %s failed. operator: %s", instanceFlag, remoteIP)
 	} else {
-		util.Logger().Infof("heartbeat successful: %s renew ttl to %d. operator: %s", instanceFlag, ttl, remoteIP)
+		log.Infof("heartbeat successful: %s renew ttl to %d. operator: %s", instanceFlag, ttl, remoteIP)
 	}
 	return &pb.HeartbeatResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Update service instance heartbeat successfully."),
@@ -328,7 +326,7 @@ func (s *InstanceService) Heartbeat(ctx context.Context, in *pb.HeartbeatRequest
 
 func (s *InstanceService) HeartbeatSet(ctx context.Context, in *pb.HeartbeatSetRequest) (*pb.HeartbeatSetResponse, error) {
 	if len(in.Instances) == 0 {
-		util.Logger().Errorf(nil, "heartbeats failed, invalid request. Body not contain Instances or is empty.")
+		log.Errorf(nil, "heartbeats failed, invalid request. Body not contain Instances or is empty.")
 		return &pb.HeartbeatSetResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, "Request format invalid."),
 		}, nil
@@ -341,13 +339,13 @@ func (s *InstanceService) HeartbeatSet(ctx context.Context, in *pb.HeartbeatSetR
 	noMultiCounter := 0
 	for _, heartbeatElement := range in.Instances {
 		if _, ok := existFlag[heartbeatElement.ServiceId+heartbeatElement.InstanceId]; ok {
-			util.Logger().Warnf("heartbeat set %s/%s multiple", heartbeatElement.ServiceId, heartbeatElement.InstanceId)
+			log.Warnf("heartbeat set %s/%s multiple", heartbeatElement.ServiceId, heartbeatElement.InstanceId)
 			continue
 		} else {
 			existFlag[heartbeatElement.ServiceId+heartbeatElement.InstanceId] = true
 			noMultiCounter++
 		}
-		util.Go(getHeartbeatFunc(ctx, domainProject, instancesHbRst, heartbeatElement))
+		gopool.Go(getHeartbeatFunc(ctx, domainProject, instancesHbRst, heartbeatElement))
 	}
 	count := 0
 	successFlag := false
@@ -366,13 +364,13 @@ func (s *InstanceService) HeartbeatSet(ctx context.Context, in *pb.HeartbeatSetR
 		}
 	}
 	if !failFlag && successFlag {
-		util.Logger().Infof("heartbeat set success")
+		log.Infof("heartbeat set success")
 		return &pb.HeartbeatSetResponse{
 			Response:  pb.CreateResponse(pb.Response_SUCCESS, "Heartbeat set successfully."),
 			Instances: instanceHbRstArr,
 		}, nil
 	} else {
-		util.Logger().Errorf(nil, "heartbeat set failed, %v", in.Instances)
+		log.Errorf(nil, "heartbeat set failed, %v", in.Instances)
 		return &pb.HeartbeatSetResponse{
 			Response:  pb.CreateResponse(scerr.ErrInstanceNotExists, "Heartbeat set failed."),
 			Instances: instanceHbRstArr,
@@ -390,7 +388,7 @@ func getHeartbeatFunc(ctx context.Context, domainProject string, instancesHbRst
 		_, _, err, _ := serviceUtil.HeartbeatUtil(ctx, domainProject, element.ServiceId, element.InstanceId)
 		if err != nil {
 			hbRst.ErrMessage = err.Error()
-			util.Logger().Errorf(err, "heartbeat set failed, %s/%s", element.ServiceId, element.InstanceId)
+			log.Errorf(err, "heartbeat set failed, %s/%s", element.ServiceId, element.InstanceId)
 		}
 		instancesHbRst <- hbRst
 	}
@@ -398,13 +396,13 @@ func getHeartbeatFunc(ctx context.Context, domainProject string, instancesHbRst
 
 func (s *InstanceService) GetOneInstance(ctx context.Context, in *pb.GetOneInstanceRequest) (*pb.GetOneInstanceResponse, error) {
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(err, "get instance failed: invalid parameters.")
+		log.Errorf(err, "get instance failed: invalid parameters.")
 		return &pb.GetOneInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
 	}
 	if checkErr := s.getInstancePreCheck(ctx, in.ProviderServiceId, in.ConsumerServiceId, in.Tags); checkErr != nil {
-		util.Logger().Errorf(checkErr, "get instance failed: pre check failed.")
+		log.Errorf(checkErr, "get instance failed: pre check failed.")
 		resp := &pb.GetOneInstanceResponse{
 			Response: pb.CreateResponseWithSCErr(checkErr),
 		}
@@ -419,13 +417,13 @@ func (s *InstanceService) GetOneInstance(ctx context.Context, in *pb.GetOneInsta
 	instanceId := in.ProviderInstanceId
 	instance, err := serviceUtil.GetInstance(ctx, util.ParseTargetDomainProject(ctx), serviceId, instanceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get instance failed, %s(consumer/provider): get instance failed.", conPro)
+		log.Errorf(err, "get instance failed, %s(consumer/provider): get instance failed.", conPro)
 		return &pb.GetOneInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if instance == nil {
-		util.Logger().Errorf(nil, "get instance failed, %s(consumer/provider): instance not exist.", conPro)
+		log.Errorf(nil, "get instance failed, %s(consumer/provider): instance not exist.", conPro)
 		return &pb.GetOneInstanceResponse{
 			Response: pb.CreateResponse(scerr.ErrInstanceNotExists, "Service instance does not exist."),
 		}, nil
@@ -465,13 +463,13 @@ func (s *InstanceService) getInstancePreCheck(ctx context.Context, providerServi
 
 func (s *InstanceService) GetInstances(ctx context.Context, in *pb.GetInstancesRequest) (*pb.GetInstancesResponse, error) {
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(err, "get instances failed: invalid parameters.")
+		log.Errorf(err, "get instances failed: invalid parameters.")
 		return &pb.GetInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
 	}
 	if checkErr := s.getInstancePreCheck(ctx, in.ProviderServiceId, in.ConsumerServiceId, in.Tags); checkErr != nil {
-		util.Logger().Errorf(checkErr, "get instances failed: pre check failed.")
+		log.Errorf(checkErr, "get instances failed: pre check failed.")
 		resp := &pb.GetInstancesResponse{
 			Response: pb.CreateResponseWithSCErr(checkErr),
 		}
@@ -484,7 +482,7 @@ func (s *InstanceService) GetInstances(ctx context.Context, in *pb.GetInstancesR
 
 	instances, err := serviceUtil.GetAllInstancesOfOneService(ctx, util.ParseTargetDomainProject(ctx), in.ProviderServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get instances failed, %s(consumer/provider): get instances from etcd failed.", conPro)
+		log.Errorf(err, "get instances failed, %s(consumer/provider): get instances from etcd failed.", conPro)
 		return &pb.GetInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -498,7 +496,7 @@ func (s *InstanceService) GetInstances(ctx context.Context, in *pb.GetInstancesR
 func (s *InstanceService) Find(ctx context.Context, in *pb.FindInstancesRequest) (*pb.FindInstancesResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "find instance failed: invalid parameters.")
+		log.Errorf(err, "find instance failed: invalid parameters.")
 		return &pb.FindInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -508,14 +506,14 @@ func (s *InstanceService) Find(ctx context.Context, in *pb.FindInstancesRequest)
 
 	service, err := serviceUtil.GetService(ctx, domainProject, in.ConsumerServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get consumer failed, consumer %s find provider %s/%s/%s",
+		log.Errorf(err, "get consumer failed, consumer %s find provider %s/%s/%s",
 			in.ConsumerServiceId, in.AppId, in.ServiceName, in.VersionRule)
 		return &pb.FindInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "consumer not exist, consumer %s find provider %s/%s/%s",
+		log.Errorf(nil, "consumer not exist, consumer %s find provider %s/%s/%s",
 			in.ConsumerServiceId, in.AppId, in.ServiceName, in.VersionRule)
 		return &pb.FindInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Consumer does not exist."),
@@ -564,14 +562,14 @@ func (s *InstanceService) Find(ctx context.Context, in *pb.FindInstancesRequest)
 	for ; i < 2; i++ {
 		item, err = cache.FindInstances.Get(cloneCtx, service, provider, in.Tags)
 		if err != nil {
-			util.Logger().Errorf(err, "FindInstancesCache.Get failed, %s", findFlag)
+			log.Errorf(err, "FindInstancesCache.Get failed, %s", findFlag)
 			return &pb.FindInstancesResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if item == nil {
 			mes := fmt.Errorf("provider does not exist, %s", findFlag)
-			util.Logger().Errorf(mes, "FindInstancesCache.Get failed")
+			log.Errorf(mes, "FindInstancesCache.Get failed")
 			return &pb.FindInstancesResponse{
 				Response: pb.CreateResponse(scerr.ErrServiceNotExists, mes.Error()),
 			}, nil
@@ -591,13 +589,13 @@ func (s *InstanceService) Find(ctx context.Context, in *pb.FindInstancesRequest)
 			err = serviceUtil.AddServiceVersionRule(ctx, domainProject, service, provider)
 		} else {
 			mes := fmt.Errorf("provider does not exist, %s", findFlag)
-			util.Logger().Errorf(mes, "AddServiceVersionRule failed")
+			log.Errorf(mes, "AddServiceVersionRule failed")
 			return &pb.FindInstancesResponse{
 				Response: pb.CreateResponse(scerr.ErrServiceNotExists, mes.Error()),
 			}, nil
 		}
 		if err != nil {
-			util.Logger().Errorf(err, "AddServiceVersionRule failed, %s", findFlag)
+			log.Errorf(err, "AddServiceVersionRule failed, %s", findFlag)
 			return &pb.FindInstancesResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
@@ -632,7 +630,7 @@ func (s *InstanceService) UpdateStatus(ctx context.Context, in *pb.UpdateInstanc
 	domainProject := util.ParseDomainProject(ctx)
 	updateStatusFlag := util.StringJoin([]string{in.ServiceId, in.InstanceId, in.Status}, "/")
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(nil, "update instance status failed, %s.", updateStatusFlag)
+		log.Errorf(nil, "update instance status failed, %s.", updateStatusFlag)
 		return &pb.UpdateInstanceStatusResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -640,13 +638,13 @@ func (s *InstanceService) UpdateStatus(ctx context.Context, in *pb.UpdateInstanc
 
 	instance, err := serviceUtil.GetInstance(ctx, domainProject, in.ServiceId, in.InstanceId)
 	if err != nil {
-		util.Logger().Errorf(err, "update instance status failed, %s: get instance from etcd failed.", updateStatusFlag)
+		log.Errorf(err, "update instance status failed, %s: get instance from etcd failed.", updateStatusFlag)
 		return &pb.UpdateInstanceStatusResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if instance == nil {
-		util.Logger().Errorf(nil, "update instance status failed, %s: instance not exist.", updateStatusFlag)
+		log.Errorf(nil, "update instance status failed, %s: instance not exist.", updateStatusFlag)
 		return &pb.UpdateInstanceStatusResponse{
 			Response: pb.CreateResponse(scerr.ErrInstanceNotExists, "Service instance does not exist."),
 		}, nil
@@ -655,7 +653,7 @@ func (s *InstanceService) UpdateStatus(ctx context.Context, in *pb.UpdateInstanc
 	instance.Status = in.Status
 
 	if err := serviceUtil.UpdateInstance(ctx, domainProject, instance); err != nil {
-		util.Logger().Errorf(err, "update instance status failed, %s", updateStatusFlag)
+		log.Errorf(err, "update instance status failed, %s", updateStatusFlag)
 		resp := &pb.UpdateInstanceStatusResponse{
 			Response: pb.CreateResponseWithSCErr(err),
 		}
@@ -665,7 +663,7 @@ func (s *InstanceService) UpdateStatus(ctx context.Context, in *pb.UpdateInstanc
 		return resp, nil
 	}
 
-	util.Logger().Infof("update instance status successful: %s.", updateStatusFlag)
+	log.Infof("update instance status successful: %s.", updateStatusFlag)
 	return &pb.UpdateInstanceStatusResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Update service instance status successfully."),
 	}, nil
@@ -675,7 +673,7 @@ func (s *InstanceService) UpdateInstanceProperties(ctx context.Context, in *pb.U
 	domainProject := util.ParseDomainProject(ctx)
 	instanceFlag := util.StringJoin([]string{in.ServiceId, in.InstanceId}, "/")
 	if err := Validate(in); err != nil {
-		util.Logger().Errorf(nil, "update instance status failed, %s.", instanceFlag)
+		log.Errorf(nil, "update instance status failed, %s.", instanceFlag)
 		return &pb.UpdateInstancePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -683,13 +681,13 @@ func (s *InstanceService) UpdateInstanceProperties(ctx context.Context, in *pb.U
 
 	instance, err := serviceUtil.GetInstance(ctx, domainProject, in.ServiceId, in.InstanceId)
 	if err != nil {
-		util.Logger().Errorf(err, "update instance properties failed, %s: get instance from etcd failed.", instanceFlag)
+		log.Errorf(err, "update instance properties failed, %s: get instance from etcd failed.", instanceFlag)
 		return &pb.UpdateInstancePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if instance == nil {
-		util.Logger().Errorf(nil, "update instance properties failed, %s: instance not exist.", instanceFlag)
+		log.Errorf(nil, "update instance properties failed, %s: instance not exist.", instanceFlag)
 		return &pb.UpdateInstancePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrInstanceNotExists, "Service instance does not exist."),
 		}, nil
@@ -698,7 +696,7 @@ func (s *InstanceService) UpdateInstanceProperties(ctx context.Context, in *pb.U
 	instance.Properties = in.Properties
 
 	if err := serviceUtil.UpdateInstance(ctx, domainProject, instance); err != nil {
-		util.Logger().Errorf(err, "update instance properties failed, %s", instanceFlag)
+		log.Errorf(err, "update instance properties failed, %s", instanceFlag)
 		resp := &pb.UpdateInstancePropsResponse{
 			Response: pb.CreateResponseWithSCErr(err),
 		}
@@ -708,7 +706,7 @@ func (s *InstanceService) UpdateInstanceProperties(ctx context.Context, in *pb.U
 		return resp, nil
 	}
 
-	util.Logger().Infof("update instance properties successful: %s.", instanceFlag)
+	log.Infof("update instance properties successful: %s.", instanceFlag)
 	return &pb.UpdateInstancePropsResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Update service instance properties successfully."),
 	}, nil
@@ -725,13 +723,13 @@ func (s *InstanceService) ClusterHealth(ctx context.Context) (*pb.GetInstancesRe
 	})
 
 	if err != nil {
-		util.Logger().Errorf(err, "health check failed: get service center serviceId failed.")
+		log.Errorf(err, "health check failed: get service center serviceId failed.")
 		return &pb.GetInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if len(serviceId) == 0 {
-		util.Logger().Errorf(nil, "health check failed: get service center serviceId not exist.")
+		log.Errorf(nil, "health check failed: get service center serviceId not exist.")
 		return &pb.GetInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service center serviceId not exist."),
 		}, nil
@@ -739,7 +737,7 @@ func (s *InstanceService) ClusterHealth(ctx context.Context) (*pb.GetInstancesRe
 
 	instances, err := serviceUtil.GetAllInstancesOfOneService(ctx, domainProject, serviceId)
 	if err != nil {
-		util.Logger().Errorf(err, "health check failed: get service center instances failed.")
+		log.Errorf(err, "health check failed: get service center instances failed.")
 		return &pb.GetInstancesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
diff --git a/server/service/microservice.go b/server/service/microservice.go
index cd88ff8..ab9b0b7 100644
--- a/server/service/microservice.go
+++ b/server/service/microservice.go
@@ -20,6 +20,8 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
@@ -46,7 +48,7 @@ const (
 
 func (s *MicroServiceService) Create(ctx context.Context, in *pb.CreateServiceRequest) (*pb.CreateServiceResponse, error) {
 	if in == nil || in.Service == nil {
-		util.Logger().Errorf(nil, "create micro-service failed : param empty.")
+		log.Errorf(nil, "create micro-service failed : param empty.")
 		return &pb.CreateServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, "request format invalid"),
 		}, nil
@@ -76,7 +78,7 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "create micro-service failed, %s: invalid parameters. operator: %s",
+		log.Errorf(err, "create micro-service failed, %s: invalid parameters. operator: %s",
 			serviceFlag, remoteIP)
 		return &pb.CreateServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
@@ -93,18 +95,17 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 		Alias:       service.Alias,
 		Version:     service.Version,
 	}
-	reporter, quotaErr := checkQuota(ctx, domainProject)
-	if reporter != nil {
-		defer reporter.Close()
-	}
-	if quotaErr != nil {
-		util.Logger().Errorf(quotaErr, "create micro-service failed, %s: check service failed before create. operator: %s",
+	reporter := checkQuota(ctx, domainProject)
+	defer reporter.Close(ctx)
+
+	if reporter != nil && reporter.Err != nil {
+		log.Errorf(reporter.Err, "create micro-service failed, %s: check service failed before create. operator: %s",
 			serviceFlag, remoteIP)
 		resp := &pb.CreateServiceResponse{
-			Response: pb.CreateResponseWithSCErr(quotaErr),
+			Response: pb.CreateResponseWithSCErr(reporter.Err),
 		}
-		if quotaErr.InternalError() {
-			return resp, quotaErr
+		if reporter.Err.InternalError() {
+			return resp, reporter.Err
 		}
 		return resp, nil
 	}
@@ -120,7 +121,7 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 
 	data, err := json.Marshal(service)
 	if err != nil {
-		util.Logger().Errorf(err, "create micro-service failed, %s: json marshal service failed. operator: %s",
+		log.Errorf(err, "create micro-service failed, %s: json marshal service failed. operator: %s",
 			serviceFlag, remoteIP)
 		return &pb.CreateServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
@@ -149,7 +150,7 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 
 	resp, err := backend.Registry().TxnWithCmp(ctx, opts, uniqueCmpOpts, nil)
 	if err != nil {
-		util.Logger().Errorf(err, "create micro-service failed, %s: commit data into etcd failed. operator: %s",
+		log.Errorf(err, "create micro-service failed, %s: commit data into etcd failed. operator: %s",
 			serviceFlag, remoteIP)
 		return &pb.CreateServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
@@ -158,7 +159,7 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 	if !resp.Succeeded {
 		if s.isCreateServiceEx(in) == true {
 			serviceIdInner, _ := serviceUtil.GetServiceId(ctx, serviceKey)
-			util.Logger().Warnf("create micro-service failed, serviceId = %s , flag = %s: service already exists. operator: %s",
+			log.Warnf("create micro-service failed, serviceId = %s , flag = %s: service already exists. operator: %s",
 				serviceIdInner, serviceFlag, remoteIP)
 
 			return &pb.CreateServiceResponse{
@@ -167,7 +168,7 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 			}, nil
 		}
 
-		util.Logger().Warnf("create micro-service failed, %s: service already exists. operator: %s",
+		log.Warnf("create micro-service failed, %s: service already exists. operator: %s",
 			serviceFlag, remoteIP)
 
 		return &pb.CreateServiceResponse{
@@ -175,12 +176,11 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 		}, nil
 	}
 
-	if reporter != nil {
-		if err := reporter.ReportUsedQuota(ctx); err != nil {
-			util.Logger().Errorf(err, "report used quota failed.")
-		}
+	if err := reporter.ReportUsedQuota(ctx); err != nil {
+		log.Errorf(err, "report used quota failed.")
 	}
-	util.Logger().Infof("create micro-service %s, serviceId: %s. operator: %s",
+
+	log.Infof("create micro-service %s, serviceId: %s. operator: %s",
 		serviceFlag, service.ServiceId, remoteIP)
 	return &pb.CreateServiceResponse{
 		Response:  pb.CreateResponse(pb.Response_SUCCESS, "Register service successfully."),
@@ -188,14 +188,14 @@ func (s *MicroServiceService) CreateServicePri(ctx context.Context, in *pb.Creat
 	}, nil
 }
 
-func checkQuota(ctx context.Context, domainProject string) (quota.QuotaReporter, *scerr.Error) {
+func checkQuota(ctx context.Context, domainProject string) *quota.ApplyQuotaResult {
 	if core.IsSCInstance(ctx) {
-		util.Logger().Debugf("service-center self register")
-		return nil, nil
+		log.Debugf("service-center self register")
+		return nil
 	}
 	res := quota.NewApplyQuotaResource(quota.MicroServiceQuotaType, domainProject, "", 1)
 	rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
-	return rst.Reporter, rst.Err
+	return rst
 }
 
 func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId string, force bool) (*pb.Response, error) {
@@ -208,18 +208,18 @@ func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId st
 
 	if serviceId == apt.Service.ServiceId {
 		err := errors.New("not allow to delete service center")
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s", title, serviceId)
 		return pb.CreateResponse(scerr.ErrInvalidParams, err.Error()), nil
 	}
 
 	service, err := serviceUtil.GetService(ctx, domainProject, serviceId)
 	if err != nil {
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s: get service failed.", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s: get service failed.", title, serviceId)
 		return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 	}
 
 	if service == nil {
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s: service not exist.", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s: service not exist.", title, serviceId)
 		return pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."), nil
 	}
 
@@ -228,11 +228,11 @@ func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId st
 		dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, service)
 		services, err := dr.GetDependencyConsumerIds()
 		if err != nil {
-			util.Logger().Errorf(err, "delete micro-service failed, serviceId is %s: inner err, get service dependency failed.", serviceId)
+			log.Errorf(err, "delete micro-service failed, serviceId is %s: inner err, get service dependency failed.", serviceId)
 			return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 		}
 		if len(services) > 1 || (len(services) == 1 && services[0] != serviceId) {
-			util.Logger().Errorf(nil, "delete micro-service failed, serviceId is %s: can't delete, other services rely it.", serviceId)
+			log.Errorf(nil, "delete micro-service failed, serviceId is %s: can't delete, other services rely it.", serviceId)
 			return pb.CreateResponse(scerr.ErrDependedOnConsumer, "Can not delete this service, other service rely it."), err
 		}
 
@@ -242,12 +242,12 @@ func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId st
 			registry.WithPrefix(),
 			registry.WithCountOnly())
 		if err != nil {
-			util.Logger().Errorf(err, "delete micro-service failed, serviceId is %s: inner err, get instances failed.", serviceId)
+			log.Errorf(err, "delete micro-service failed, serviceId is %s: inner err, get instances failed.", serviceId)
 			return pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()), err
 		}
 
 		if rsp.Count > 0 {
-			util.Logger().Errorf(nil, "delete micro-service failed, serviceId is %s: can't delete, exist instance.", serviceId)
+			log.Errorf(nil, "delete micro-service failed, serviceId is %s: can't delete, exist instance.", serviceId)
 			return pb.CreateResponse(scerr.ErrDeployedInstance, "Can not delete this service, exist instance."), err
 		}
 	}
@@ -270,7 +270,7 @@ func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId st
 	//删除依赖规则
 	optDeleteDep, err := serviceUtil.DeleteDependencyForDeleteService(domainProject, serviceId, serviceKey)
 	if err != nil {
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s: inner err, delete dependency failed.", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s: inner err, delete dependency failed.", title, serviceId)
 		return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 	}
 	opts = append(opts, optDeleteDep)
@@ -306,7 +306,7 @@ func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId st
 	//删除实例
 	err = serviceUtil.DeleteServiceAllInstances(ctx, serviceId)
 	if err != nil {
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s: delete all instances failed.", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s: delete all instances failed.", title, serviceId)
 		return pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()), err
 	}
 
@@ -316,24 +316,24 @@ func (s *MicroServiceService) DeleteServicePri(ctx context.Context, serviceId st
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s: commit data into etcd failed.", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s: commit data into etcd failed.", title, serviceId)
 		return pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()), err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(err, "%s micro-service failed, serviceId is %s: service does noet exist.", title, serviceId)
+		log.Errorf(err, "%s micro-service failed, serviceId is %s: service does noet exist.", title, serviceId)
 		return pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."), nil
 	}
 
 	serviceUtil.RemandServiceQuota(ctx)
 
-	util.Logger().Infof("%s micro-service successful: serviceId is %s, operator is %s.", title, serviceId, util.GetIPFromContext(ctx))
+	log.Infof("%s micro-service successful: serviceId is %s, operator is %s.", title, serviceId, util.GetIPFromContext(ctx))
 	return pb.CreateResponse(pb.Response_SUCCESS, "Unregister service successfully."), nil
 }
 
 func (s *MicroServiceService) Delete(ctx context.Context, in *pb.DeleteServiceRequest) (*pb.DeleteServiceResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "delete micro-service failed, serviceId is %s: invalid parameters.", in.ServiceId)
+		log.Errorf(err, "delete micro-service failed, serviceId is %s: invalid parameters.", in.ServiceId)
 		return &pb.DeleteServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -362,7 +362,7 @@ func (s *MicroServiceService) DeleteServices(ctx context.Context, request *pb.De
 	for _, serviceId := range request.ServiceIds {
 		//ServiceId重复性检查
 		if _, ok := existFlag[serviceId]; ok {
-			util.Logger().Warnf("delete micro-service %s , multiple.", serviceId)
+			log.Warnf("delete micro-service %s , multiple.", serviceId)
 			continue
 		} else {
 			existFlag[serviceId] = true
@@ -376,7 +376,7 @@ func (s *MicroServiceService) DeleteServices(ctx context.Context, request *pb.De
 		}
 		err := Validate(in)
 		if err != nil {
-			util.Logger().Errorf(err, "delete micro-service failed, serviceId is %s: invalid parameters.", in.ServiceId)
+			log.Errorf(err, "delete micro-service failed, serviceId is %s: invalid parameters.", in.ServiceId)
 			serviceRespChan <- &pb.DelServicesRspInfo{
 				ServiceId:  serviceId,
 				ErrMessage: err.Error(),
@@ -385,7 +385,7 @@ func (s *MicroServiceService) DeleteServices(ctx context.Context, request *pb.De
 		}
 
 		//执行删除服务操作
-		util.Go(s.getDeleteServiceFunc(ctx, serviceId, request.Force, serviceRespChan))
+		gopool.Go(s.getDeleteServiceFunc(ctx, serviceId, request.Force, serviceRespChan))
 	}
 
 	//获取批量删除服务的结果
@@ -404,7 +404,7 @@ func (s *MicroServiceService) DeleteServices(ctx context.Context, request *pb.De
 		}
 	}
 
-	util.Logger().Infof("Batch DeleteServices, count is %d, serviceId = %v , result = %d, ", len(request.ServiceIds), request.ServiceIds, responseCode)
+	log.Infof("Batch DeleteServices, count is %d, serviceId = %v , result = %d, ", len(request.ServiceIds), request.ServiceIds, responseCode)
 
 	resp := &pb.DelServicesResponse{
 		Services: delServiceRspInfo,
@@ -437,7 +437,7 @@ func (s *MicroServiceService) getDeleteServiceFunc(ctx context.Context, serviceI
 func (s *MicroServiceService) GetOne(ctx context.Context, in *pb.GetServiceRequest) (*pb.GetServiceResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "get micro-service failed, serviceId is %s: invalid parameters.",
+		log.Errorf(err, "get micro-service failed, serviceId is %s: invalid parameters.",
 			in.ServiceId)
 		return &pb.GetServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
@@ -447,13 +447,13 @@ func (s *MicroServiceService) GetOne(ctx context.Context, in *pb.GetServiceReque
 	service, err := serviceUtil.GetService(ctx, domainProject, in.ServiceId)
 
 	if err != nil {
-		util.Logger().Errorf(err, "get micro-service failed, serviceId is %s: inner err, get service failed.", in.ServiceId)
+		log.Errorf(err, "get micro-service failed, serviceId is %s: inner err, get service failed.", in.ServiceId)
 		return &pb.GetServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "get micro-service failed, serviceId is %s: service not exist.", in.ServiceId)
+		log.Errorf(nil, "get micro-service failed, serviceId is %s: service not exist.", in.ServiceId)
 		return &pb.GetServiceResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "service does not exist."),
 		}, nil
@@ -467,7 +467,7 @@ func (s *MicroServiceService) GetOne(ctx context.Context, in *pb.GetServiceReque
 func (s *MicroServiceService) GetServices(ctx context.Context, in *pb.GetServicesRequest) (*pb.GetServicesResponse, error) {
 	services, err := serviceUtil.GetAllServiceUtil(ctx)
 	if err != nil {
-		util.Logger().Errorf(err, "get services failed: inner err.")
+		log.Errorf(err, "get services failed: inner err.")
 		return &pb.GetServicesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -482,7 +482,7 @@ func (s *MicroServiceService) GetServices(ctx context.Context, in *pb.GetService
 func (s *MicroServiceService) UpdateProperties(ctx context.Context, in *pb.UpdateServicePropsRequest) (*pb.UpdateServicePropsResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "update service properties failed, serviceId is %s: invalid parameters.", in.ServiceId)
+		log.Errorf(err, "update service properties failed, serviceId is %s: invalid parameters.", in.ServiceId)
 		return &pb.UpdateServicePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -493,13 +493,13 @@ func (s *MicroServiceService) UpdateProperties(ctx context.Context, in *pb.Updat
 	key := apt.GenerateServiceKey(domainProject, in.ServiceId)
 	service, err := serviceUtil.GetService(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "update service properties failed, serviceId is %s: query service failed.", in.ServiceId)
+		log.Errorf(err, "update service properties failed, serviceId is %s: query service failed.", in.ServiceId)
 		return &pb.UpdateServicePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "update service properties failed, serviceId is %s: service not exist.", in.ServiceId)
+		log.Errorf(nil, "update service properties failed, serviceId is %s: service not exist.", in.ServiceId)
 		return &pb.UpdateServicePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "service does not exist."),
 		}, nil
@@ -512,7 +512,7 @@ func (s *MicroServiceService) UpdateProperties(ctx context.Context, in *pb.Updat
 
 	data, err := json.Marshal(service)
 	if err != nil {
-		util.Logger().Errorf(err, "update service properties failed, serviceId is %s: json marshal service failed.", in.ServiceId)
+		log.Errorf(err, "update service properties failed, serviceId is %s: json marshal service failed.", in.ServiceId)
 		return &pb.UpdateServicePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -526,19 +526,19 @@ func (s *MicroServiceService) UpdateProperties(ctx context.Context, in *pb.Updat
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err, "update service properties failed, serviceId is %s: commit data into etcd failed.", in.ServiceId)
+		log.Errorf(err, "update service properties failed, serviceId is %s: commit data into etcd failed.", in.ServiceId)
 		return &pb.UpdateServicePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
 		}, err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(err, "update service properties failed, serviceId is %s: service does not exist.", in.ServiceId)
+		log.Errorf(err, "update service properties failed, serviceId is %s: service does not exist.", in.ServiceId)
 		return &pb.UpdateServicePropsResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	util.Logger().Infof("update service properties successful: serviceId is %s.", in.ServiceId)
+	log.Infof("update service properties successful: serviceId is %s.", in.ServiceId)
 	return &pb.UpdateServicePropsResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "update service successfully."),
 	}, nil
@@ -551,7 +551,7 @@ func (s *MicroServiceService) Exist(ctx context.Context, in *pb.GetExistenceRequ
 		err := ExistenceReqValidator().Validate(in)
 		serviceFlag := util.StringJoin([]string{in.AppId, in.ServiceName, in.Version}, "/")
 		if err != nil {
-			util.Logger().Errorf(err, "micro-service exist failed, service %s: invalid params.", serviceFlag)
+			log.Errorf(err, "micro-service exist failed, service %s: invalid params.", serviceFlag)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 			}, nil
@@ -566,19 +566,19 @@ func (s *MicroServiceService) Exist(ctx context.Context, in *pb.GetExistenceRequ
 			Tenant:      domainProject,
 		})
 		if err != nil {
-			util.Logger().Errorf(err, "micro-service exist failed, find %s serviceIds failed.", serviceFlag)
+			log.Errorf(err, "micro-service exist failed, find %s serviceIds failed.", serviceFlag)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if !exist {
-			util.Logger().Infof("micro-service exist failed, service %s does not exist.", serviceFlag)
+			log.Infof("micro-service exist failed, service %s does not exist.", serviceFlag)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrServiceNotExists, serviceFlag+" does not exist."),
 			}, nil
 		}
 		if len(ids) == 0 {
-			util.Logger().Infof("micro-service exist failed, %s version mismatch.", serviceFlag)
+			log.Infof("micro-service exist failed, %s version mismatch.", serviceFlag)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrServiceVersionNotExists, serviceFlag+" version mismatch."),
 			}, nil
@@ -590,14 +590,14 @@ func (s *MicroServiceService) Exist(ctx context.Context, in *pb.GetExistenceRequ
 	case EXIST_TYPE_SCHEMA:
 		err := GetSchemaReqValidator().Validate(in)
 		if err != nil {
-			util.Logger().Errorf(err, "schema exist failed, serviceId %s, schemaId %s: invalid params.", in.ServiceId, in.SchemaId)
+			log.Errorf(err, "schema exist failed, serviceId %s, schemaId %s: invalid params.", in.ServiceId, in.SchemaId)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 			}, nil
 		}
 
 		if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-			util.Logger().Warnf("schema exist failed, serviceId %s, schemaId %s: service not exist.", in.ServiceId, in.SchemaId)
+			log.Warnf("schema exist failed, serviceId %s, schemaId %s: service not exist.", in.ServiceId, in.SchemaId)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrServiceNotExists, "service does not exist."),
 			}, nil
@@ -606,20 +606,20 @@ func (s *MicroServiceService) Exist(ctx context.Context, in *pb.GetExistenceRequ
 		key := apt.GenerateServiceSchemaKey(domainProject, in.ServiceId, in.SchemaId)
 		exist, err := serviceUtil.CheckSchemaInfoExist(ctx, key)
 		if err != nil {
-			util.Logger().Errorf(err, "schema exist failed, serviceId %s, schemaId %s: get schema failed.", in.ServiceId, in.SchemaId)
+			log.Errorf(err, "schema exist failed, serviceId %s, schemaId %s: get schema failed.", in.ServiceId, in.SchemaId)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if !exist {
-			util.Logger().Infof("schema exist failed, serviceId %s, schemaId %s: schema not exist.", in.ServiceId, in.SchemaId)
+			log.Infof("schema exist failed, serviceId %s, schemaId %s: schema not exist.", in.ServiceId, in.SchemaId)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrSchemaNotExists, "schema does not exist."),
 			}, nil
 		}
 		schemaSummary, err := getSchemaSummary(ctx, domainProject, in.ServiceId, in.SchemaId)
 		if err != nil {
-			util.Logger().Errorf(err, "schema exist failed, serviceId %s, schemaId %s: get schema summary failed.", in.ServiceId, in.SchemaId)
+			log.Errorf(err, "schema exist failed, serviceId %s, schemaId %s: get schema summary failed.", in.ServiceId, in.SchemaId)
 			return &pb.GetExistenceResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
@@ -630,7 +630,7 @@ func (s *MicroServiceService) Exist(ctx context.Context, in *pb.GetExistenceRequ
 			Summary:  schemaSummary,
 		}, nil
 	default:
-		util.Logger().Warnf("unexpected type '%s' for query.", in.Type)
+		log.Warnf("unexpected type '%s' for query.", in.Type)
 		return &pb.GetExistenceResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, "Only micro-service and schema can be used as type."),
 		}, nil
@@ -647,7 +647,7 @@ func (s *MicroServiceService) CreateServiceEx(ctx context.Context, in *pb.Create
 	//create rules
 	if in.Rules != nil && len(in.Rules) != 0 {
 		chanLen++
-		util.Go(func(_ context.Context) {
+		gopool.Go(func(_ context.Context) {
 			req := &pb.AddServiceRulesRequest{
 				ServiceId: serviceId,
 				Rules:     in.Rules,
@@ -667,7 +667,7 @@ func (s *MicroServiceService) CreateServiceEx(ctx context.Context, in *pb.Create
 	//create tags
 	if in.Tags != nil && len(in.Tags) != 0 {
 		chanLen++
-		util.Go(func(_ context.Context) {
+		gopool.Go(func(_ context.Context) {
 			req := &pb.AddServiceTagsRequest{
 				ServiceId: serviceId,
 				Tags:      in.Tags,
@@ -687,7 +687,7 @@ func (s *MicroServiceService) CreateServiceEx(ctx context.Context, in *pb.Create
 	// create instance
 	if in.Instances != nil && len(in.Instances) != 0 {
 		chanLen++
-		util.Go(func(_ context.Context) {
+		gopool.Go(func(_ context.Context) {
 			chanRsp := &pb.Response{}
 			for _, ins := range in.Instances {
 				req := &pb.RegisterInstanceRequest{
@@ -724,7 +724,7 @@ func (s *MicroServiceService) CreateServiceEx(ctx context.Context, in *pb.Create
 		errMessage, err := json.Marshal(errMessages)
 		if err != nil {
 			result.Response.Message = "marshal errMessages error"
-			util.Logger().Error("marshal errMessages error", err)
+			log.Error("marshal errMessages error", err)
 			return result, nil
 		}
 		result.Response.Message = fmt.Sprintf("errMessage : %s", string(errMessage))
@@ -732,7 +732,7 @@ func (s *MicroServiceService) CreateServiceEx(ctx context.Context, in *pb.Create
 		result.Response.Code = pb.Response_SUCCESS
 	}
 
-	util.Logger().Infof("createServiceEx, serviceId = %s, result = %s ", result.ServiceId, result.Response.Message)
+	log.Infof("createServiceEx, serviceId = %s, result = %s ", result.ServiceId, result.Response.Message)
 	return result, nil
 }
 
diff --git a/server/service/notification/listwatcher.go b/server/service/notification/listwatcher.go
index bffbb45..feffe64 100644
--- a/server/service/notification/listwatcher.go
+++ b/server/service/notification/listwatcher.go
@@ -17,7 +17,8 @@
 package notification
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"golang.org/x/net/context"
 	"time"
@@ -48,8 +49,8 @@ func (w *ListWatcher) OnAccept() {
 	if w.Err() != nil {
 		return
 	}
-	util.Logger().Debugf("accepted by notify service, %s watcher %s %s", w.Type(), w.Group(), w.Subject())
-	util.Go(w.listAndPublishJobs)
+	log.Debugf("accepted by notify service, %s watcher %s %s", w.Type(), w.Group(), w.Subject())
+	gopool.Go(w.listAndPublishJobs)
 }
 
 func (w *ListWatcher) listAndPublishJobs(_ context.Context) {
@@ -83,14 +84,14 @@ func (w *ListWatcher) OnMessage(job NotifyJob) {
 		case <-w.listCh:
 			timer.Stop()
 		case <-timer.C:
-			util.Logger().Errorf(nil,
+			log.Errorf(nil,
 				"the %s listwatcher %s %s is not ready[over %s], send the event %v",
 				w.Type(), w.Group(), w.Subject(), w.Timeout(), job)
 		}
 	}
 
 	if wJob.Revision <= w.ListRevision {
-		util.Logger().Warnf("unexpected notify %s job is coming in, watcher %s %s, job is %v, current revision is %v",
+		log.Warnf("unexpected notify %s job is coming in, watcher %s %s, job is %v, current revision is %v",
 			w.Type(), w.Group(), w.Subject(), job, w.ListRevision)
 		return
 	}
@@ -98,7 +99,7 @@ func (w *ListWatcher) OnMessage(job NotifyJob) {
 }
 
 func (w *ListWatcher) sendMessage(job *WatchJob) {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	select {
 	case w.Job <- job:
 	default:
@@ -107,7 +108,7 @@ func (w *ListWatcher) sendMessage(job *WatchJob) {
 		case w.Job <- job:
 			timer.Stop()
 		case <-timer.C:
-			util.Logger().Errorf(nil,
+			log.Errorf(nil,
 				"the %s watcher %s %s event queue is full[over %s], drop the event %v",
 				w.Type(), w.Group(), w.Subject(), w.Timeout(), job)
 		}
diff --git a/server/service/notification/notification_healthchecker.go b/server/service/notification/notification_healthchecker.go
index 597713c..ddd84af 100644
--- a/server/service/notification/notification_healthchecker.go
+++ b/server/service/notification/notification_healthchecker.go
@@ -16,7 +16,7 @@
  */
 package notification
 
-import "github.com/apache/incubator-servicecomb-service-center/pkg/util"
+import "github.com/apache/incubator-servicecomb-service-center/pkg/log"
 
 const (
 	NOTIFY_SERVER_CHECKER_NAME  = "__HealthChecker__"
@@ -38,12 +38,12 @@ func (s *NotifyServiceHealthChecker) OnMessage(job NotifyJob) {
 	err := j.ErrorSubscriber.Err()
 
 	if j.ErrorSubscriber.Type() == NOTIFTY {
-		util.Logger().Errorf(nil, "remove %s watcher %s %s failed, here cause a dead lock",
+		log.Errorf(nil, "remove %s watcher %s %s failed, here cause a dead lock",
 			j.ErrorSubscriber.Type(), j.ErrorSubscriber.Subject(), j.ErrorSubscriber.Group())
 		return
 	}
 
-	util.Logger().Debugf("notification service remove %s watcher, error: %s, subject: %s, group: %s",
+	log.Debugf("notification service remove %s watcher, error: %s, subject: %s, group: %s",
 		j.ErrorSubscriber.Type(), err.Error(), j.ErrorSubscriber.Subject(), j.ErrorSubscriber.Group())
 	s.Service().RemoveSubscriber(j.ErrorSubscriber)
 }
diff --git a/server/service/notification/notification_service.go b/server/service/notification/notification_service.go
index 8837396..e28fc91 100644
--- a/server/service/notification/notification_service.go
+++ b/server/service/notification/notification_service.go
@@ -18,6 +18,8 @@ package notification
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"golang.org/x/net/context"
 	"sync"
@@ -28,13 +30,13 @@ var notifyService *NotifyService
 func init() {
 	notifyService = &NotifyService{
 		isClose:   true,
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 }
 
 type NotifyService struct {
 	processors *util.ConcurrentMap
-	goroutine  *util.GoRoutine
+	goroutine  *gopool.Pool
 	err        chan error
 	closeMux   sync.RWMutex
 	isClose    bool
@@ -54,7 +56,7 @@ func (s *NotifyService) init() {
 
 func (s *NotifyService) Start() {
 	if !s.Closed() {
-		util.Logger().Warnf("notify service is already running")
+		log.Warnf("notify service is already running")
 		return
 	}
 	s.closeMux.Lock()
@@ -65,7 +67,7 @@ func (s *NotifyService) Start() {
 	// 错误subscriber清理
 	s.AddSubscriber(NewNotifyServiceHealthChecker())
 
-	util.Logger().Debugf("notify service is started")
+	log.Debugf("notify service is started")
 
 	s.processors.ForEach(func(item util.MapItem) (next bool) {
 		s.goroutine.Do(item.Value.(*Processor).Do)
@@ -141,7 +143,7 @@ func (s *NotifyService) Stop() {
 
 	close(s.err)
 
-	util.Logger().Debug("notify service stopped")
+	log.Debug("notify service stopped")
 }
 
 func GetNotifyService() *NotifyService {
diff --git a/server/service/notification/notification_test.go b/server/service/notification/notification_test.go
index 014e06e..97527a1 100644
--- a/server/service/notification/notification_test.go
+++ b/server/service/notification/notification_test.go
@@ -17,7 +17,7 @@
 package notification
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"golang.org/x/net/context"
 	"testing"
 	"time"
@@ -31,7 +31,7 @@ func TestGetNotifyService(t *testing.T) {
 
 	notifyService := &NotifyService{
 		isClose:   true,
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 	if notifyService == nil {
 		t.Fatalf("TestGetNotifyService failed")
diff --git a/server/service/notification/processor.go b/server/service/notification/processor.go
index 7fe27f1..a0fd53d 100644
--- a/server/service/notification/processor.go
+++ b/server/service/notification/processor.go
@@ -17,6 +17,7 @@
 package notification
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	"golang.org/x/net/context"
 )
@@ -79,7 +80,7 @@ func (p *Processor) Clear() {
 }
 
 func (p *Processor) Accept(job NotifyJob) {
-	defer util.RecoverAndReport()
+	defer log.Recover()
 	p.queue <- job
 }
 
diff --git a/server/service/notification/processor_test.go b/server/service/notification/processor_test.go
index da4bd86..ed5f270 100644
--- a/server/service/notification/processor_test.go
+++ b/server/service/notification/processor_test.go
@@ -17,7 +17,7 @@
 package notification
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"testing"
 )
 
@@ -25,7 +25,7 @@ func TestProcessor_Do(t *testing.T) {
 	mock1 := &mockSubscriber{BaseSubscriber: NewSubscriber(INSTANCE, "s1", "g1")}
 	mock2 := &mockSubscriber{BaseSubscriber: NewSubscriber(INSTANCE, "s1", "g2")}
 	p := NewProcessor("p1", 0)
-	util.Go(p.Do)
+	gopool.Go(p.Do)
 	if p.Name() != "p1" {
 		t.Fatalf("TestProcessor_Do")
 	}
diff --git a/server/service/notification/publisher.go b/server/service/notification/publisher.go
index 17bab45..861e863 100644
--- a/server/service/notification/publisher.go
+++ b/server/service/notification/publisher.go
@@ -17,7 +17,7 @@
 package notification
 
 import (
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
 	"golang.org/x/net/context"
 	"sync"
 	"time"
@@ -33,11 +33,11 @@ func init() {
 type Publisher struct {
 	wss       []*WebSocket
 	lock      sync.Mutex
-	goroutine *util.GoRoutine
+	goroutine *gopool.Pool
 }
 
 func (wh *Publisher) Run() {
-	util.Go(publisher.loop)
+	gopool.Go(publisher.loop)
 }
 
 func (wh *Publisher) Stop() {
@@ -98,6 +98,6 @@ func (wh *Publisher) Accept(ws *WebSocket) {
 
 func NewPublisher() *Publisher {
 	return &Publisher{
-		goroutine: util.NewGo(context.Background()),
+		goroutine: gopool.New(context.Background()),
 	}
 }
diff --git a/server/service/notification/stream.go b/server/service/notification/stream.go
index f215553..da44f3e 100644
--- a/server/service/notification/stream.go
+++ b/server/service/notification/stream.go
@@ -18,6 +18,7 @@ package notification
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"time"
@@ -35,17 +36,17 @@ func HandleWatchJob(watcher *ListWatcher, stream pb.ServiceInstanceCtrl_WatchSer
 		case job := <-watcher.Job:
 			if job == nil {
 				err = errors.New("channel is closed")
-				util.Logger().Errorf(err, "watcher caught an exception, subject: %s, group: %s",
+				log.Errorf(err, "watcher caught an exception, subject: %s, group: %s",
 					watcher.Subject(), watcher.Group())
 				return
 			}
 			resp := job.Response
-			util.Logger().Infof("event is coming in, watcher, subject: %s, group: %s",
+			log.Infof("event is coming in, watcher, subject: %s, group: %s",
 				watcher.Subject(), watcher.Group())
 
 			err = stream.Send(resp)
 			if err != nil {
-				util.Logger().Errorf(err, "send message error, subject: %s, group: %s",
+				log.Errorf(err, "send message error, subject: %s, group: %s",
 					watcher.Subject(), watcher.Group())
 				watcher.SetError(err)
 				return
diff --git a/server/service/notification/websocket.go b/server/service/notification/websocket.go
index 00778ea..deafd5f 100644
--- a/server/service/notification/websocket.go
+++ b/server/service/notification/websocket.go
@@ -19,6 +19,7 @@ package notification
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
@@ -53,11 +54,11 @@ func (wh *WebSocket) Init() error {
 	if err := GetNotifyService().AddSubscriber(wh.watcher); err != nil {
 		err = fmt.Errorf("establish[%s] websocket watch failed: notify service error, %s",
 			remoteAddr, err.Error())
-		util.Logger().Errorf(nil, err.Error())
+		log.Errorf(nil, err.Error())
 
 		werr := wh.conn.WriteMessage(websocket.TextMessage, util.StringToBytesWithNoCopy(err.Error()))
 		if werr != nil {
-			util.Logger().Errorf(werr, "establish[%s] websocket watch failed: write message failed.", remoteAddr)
+			log.Errorf(werr, "establish[%s] websocket watch failed: write message failed.", remoteAddr)
 		}
 		return err
 	}
@@ -65,7 +66,7 @@ func (wh *WebSocket) Init() error {
 	// put in publisher queue
 	publisher.Accept(wh)
 
-	util.Logger().Debugf("start watching instance status, watcher[%s], subject: %s, group: %s",
+	log.Debugf("start watching instance status, watcher[%s], subject: %s, group: %s",
 		remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 	return nil
 }
@@ -81,7 +82,7 @@ func (wh *WebSocket) heartbeat(messageType int) error {
 		if messageType == websocket.PongMessage {
 			messageTypeName = "Pong"
 		}
-		util.Logger().Errorf(err, "fail to send '%s' to watcher[%s], subject: %s, group: %s",
+		log.Errorf(err, "fail to send '%s' to watcher[%s], subject: %s, group: %s",
 			messageTypeName, wh.conn.RemoteAddr(), wh.watcher.Subject(), wh.watcher.Group())
 		//wh.watcher.SetError(err)
 		return err
@@ -94,7 +95,7 @@ func (wh *WebSocket) HandleWatchWebSocketControlMessage() {
 	// PING
 	wh.conn.SetPingHandler(func(message string) error {
 		if wh.needPingWatcher {
-			util.Logger().Infof("received 'Ping' message '%s' from watcher[%s], no longer send 'Ping' to it, subject: %s, group: %s",
+			log.Infof("received 'Ping' message '%s' from watcher[%s], no longer send 'Ping' to it, subject: %s, group: %s",
 				message, remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 		}
 		wh.needPingWatcher = false
@@ -102,13 +103,13 @@ func (wh *WebSocket) HandleWatchWebSocketControlMessage() {
 	})
 	// PONG
 	wh.conn.SetPongHandler(func(message string) error {
-		util.Logger().Debugf("received 'Pong' message '%s' from watcher[%s], subject: %s, group: %s",
+		log.Debugf("received 'Pong' message '%s' from watcher[%s], subject: %s, group: %s",
 			message, remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 		return nil
 	})
 	// CLOSE
 	wh.conn.SetCloseHandler(func(code int, text string) error {
-		util.Logger().Infof("watcher[%s] active closed, code: %d, message: '%s', subject: %s, group: %s",
+		log.Infof("watcher[%s] active closed, code: %d, message: '%s', subject: %s, group: %s",
 			remoteAddr, code, text, wh.watcher.Subject(), wh.watcher.Group())
 		return wh.sendClose(code, text)
 	})
@@ -131,7 +132,7 @@ func (wh *WebSocket) sendClose(code int, text string) error {
 	}
 	err := wh.conn.WriteControl(websocket.CloseMessage, message, time.Now().Add(wh.Timeout()))
 	if err != nil {
-		util.Logger().Errorf(err, "watcher[%s] catch an err, subject: %s, group: %s",
+		log.Errorf(err, "watcher[%s] catch an err, subject: %s, group: %s",
 			remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 		return err
 	}
@@ -174,7 +175,7 @@ func (wh *WebSocket) HandleWatchWebSocketJob(o interface{}) {
 	switch o.(type) {
 	case error:
 		err := o.(error)
-		util.Logger().Errorf(err, "watcher[%s] catch an err, subject: %s, group: %s",
+		log.Errorf(err, "watcher[%s] catch an err, subject: %s, group: %s",
 			remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 
 		message = util.StringToBytesWithNoCopy(fmt.Sprintf("watcher catch an err: %s", err.Error()))
@@ -189,7 +190,7 @@ func (wh *WebSocket) HandleWatchWebSocketJob(o interface{}) {
 			return
 		}
 
-		util.Logger().Debugf("send 'Ping' message to watcher[%s], subject: %s, group: %s",
+		log.Debugf("send 'Ping' message to watcher[%s], subject: %s, group: %s",
 			remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 		wh.heartbeat(websocket.PingMessage)
 		return
@@ -201,20 +202,20 @@ func (wh *WebSocket) HandleWatchWebSocketJob(o interface{}) {
 		if resp.Action != string(pb.EVT_EXPIRE) {
 			providerFlag = fmt.Sprintf("%s/%s(%s)", resp.Instance.ServiceId, resp.Instance.InstanceId, providerFlag)
 		}
-		util.Logger().Infof("event[%s] is coming in, watcher[%s] watch %s, subject: %s, group: %s",
+		log.Infof("event[%s] is coming in, watcher[%s] watch %s, subject: %s, group: %s",
 			resp.Action, remoteAddr, providerFlag, wh.watcher.Subject(), wh.watcher.Group())
 
 		resp.Response = nil
 		data, err := json.Marshal(resp)
 		if err != nil {
-			util.Logger().Errorf(err, "watcher[%s] watch %s, subject: %s, group: %s",
+			log.Errorf(err, "watcher[%s] watch %s, subject: %s, group: %s",
 				remoteAddr, providerFlag, o, wh.watcher.Subject(), wh.watcher.Group())
 			message = util.StringToBytesWithNoCopy(fmt.Sprintf("marshal output file error, %s", err.Error()))
 			break
 		}
 		message = data
 	default:
-		util.Logger().Errorf(nil, "watcher[%s] unknown input %v, subject: %s, group: %s",
+		log.Errorf(nil, "watcher[%s] unknown input %v, subject: %s, group: %s",
 			remoteAddr, o, wh.watcher.Subject(), wh.watcher.Group())
 		return
 	}
@@ -227,7 +228,7 @@ func (wh *WebSocket) HandleWatchWebSocketJob(o interface{}) {
 
 	err := wh.conn.WriteMessage(websocket.TextMessage, message)
 	if err != nil {
-		util.Logger().Errorf(err, "watcher[%s] catch an err, subject: %s, group: %s",
+		log.Errorf(err, "watcher[%s] catch an err, subject: %s, group: %s",
 			remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
 	}
 }
@@ -269,8 +270,8 @@ func process(socket *WebSocket) {
 
 func EstablishWebSocketError(conn *websocket.Conn, err error) {
 	remoteAddr := conn.RemoteAddr().String()
-	util.Logger().Errorf(err, "establish[%s] websocket watch failed.", remoteAddr)
+	log.Errorf(err, "establish[%s] websocket watch failed.", remoteAddr)
 	if err := conn.WriteMessage(websocket.TextMessage, util.StringToBytesWithNoCopy(err.Error())); err != nil {
-		util.Logger().Errorf(err, "establish[%s] websocket watch failed: write message failed.", remoteAddr)
+		log.Errorf(err, "establish[%s] websocket watch failed: write message failed.", remoteAddr)
 	}
 }
diff --git a/server/service/rule.go b/server/service/rule.go
index 42b2ce7..40ca4bd 100644
--- a/server/service/rule.go
+++ b/server/service/rule.go
@@ -18,6 +18,7 @@ package service
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -35,7 +36,7 @@ import (
 func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRulesRequest) (*pb.AddServiceRulesResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "add rule failed, serviceId is %s.", in.ServiceId)
+		log.Errorf(err, "add rule failed, serviceId is %s.", in.ServiceId)
 		return &pb.AddServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -45,7 +46,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 
 	// service id存在性校验
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "add rule failed, serviceId is %s: service not exist.", in.ServiceId)
+		log.Errorf(nil, "add rule failed, serviceId is %s: service not exist.", in.ServiceId)
 		return &pb.AddServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, "Service does not exist."),
 		}, nil
@@ -54,7 +55,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 	rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
 	errQuota := rst.Err
 	if errQuota != nil {
-		util.Logger().Errorf(errQuota, "")
+		log.Errorf(errQuota, "")
 		response := &pb.AddServiceRulesResponse{
 			Response: pb.CreateResponseWithSCErr(errQuota),
 		}
@@ -78,7 +79,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 			ruleType = rule.RuleType
 		} else {
 			if ruleType != rule.RuleType {
-				util.Logger().Errorf(nil, "add rule failed, serviceId is %s:can only exist one type, BLACK or WHITE.", in.ServiceId)
+				log.Errorf(nil, "add rule failed, serviceId is %s:can only exist one type, BLACK or WHITE.", in.ServiceId)
 				return &pb.AddServiceRulesResponse{
 					Response: pb.CreateResponse(scerr.ErrBlackAndWhiteRule, "Service can only contain one rule type, BLACK or WHITE."),
 				}, nil
@@ -87,7 +88,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 
 		//同一服务,attribute和pattern确定一个rule
 		if serviceUtil.RuleExist(ctx, domainProject, in.ServiceId, rule.Attribute, rule.Pattern) {
-			util.Logger().Infof("This rule more exists, %s ", in.ServiceId)
+			log.Infof("This rule more exists, %s ", in.ServiceId)
 			continue
 		}
 
@@ -109,7 +110,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 
 		data, err := json.Marshal(ruleAdd)
 		if err != nil {
-			util.Logger().Errorf(err, "add rule failed, serviceId is %s: marshal rule failed.", in.ServiceId)
+			log.Errorf(err, "add rule failed, serviceId is %s: marshal rule failed.", in.ServiceId)
 			return &pb.AddServiceRulesResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
@@ -119,7 +120,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 		opts = append(opts, registry.OpPut(registry.WithStrKey(indexKey), registry.WithStrValue(ruleAdd.RuleId)))
 	}
 	if len(opts) <= 0 {
-		util.Logger().Infof("add rule successful, serviceId is %s: rule already exists, no rules to add.", in.ServiceId)
+		log.Infof("add rule successful, serviceId is %s: rule already exists, no rules to add.", in.ServiceId)
 		return &pb.AddServiceRulesResponse{
 			Response: pb.CreateResponse(pb.Response_SUCCESS, "Service rules has been added."),
 		}, nil
@@ -131,19 +132,19 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err, "add rule failed, serviceId is %s: commit data into etcd failed.", in.ServiceId)
+		log.Errorf(err, "add rule failed, serviceId is %s: commit data into etcd failed.", in.ServiceId)
 		return &pb.AddServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
 		}, err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(nil, "add rule failed, serviceId is %s: service does not exist.", in.ServiceId)
+		log.Errorf(nil, "add rule failed, serviceId is %s: service does not exist.", in.ServiceId)
 		return &pb.AddServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	util.Logger().Infof("add rule successful, serviceId %s, ruleIds %v.", in.ServiceId, ruleIds)
+	log.Infof("add rule successful, serviceId %s, ruleIds %v.", in.ServiceId, ruleIds)
 	return &pb.AddServiceRulesResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Add service rules successfully."),
 		RuleIds:  ruleIds,
@@ -153,7 +154,7 @@ func (s *MicroServiceService) AddRule(ctx context.Context, in *pb.AddServiceRule
 func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServiceRuleRequest) (*pb.UpdateServiceRuleResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -163,7 +164,7 @@ func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServi
 
 	// service id存在性校验
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "update rule failed, serviceId is %s, ruleId is %s: service not exist.", in.ServiceId, in.RuleId)
+		log.Errorf(nil, "update rule failed, serviceId is %s, ruleId is %s: service not exist.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -172,13 +173,13 @@ func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServi
 	//是否能改变ruleType
 	ruleType, ruleNum, err := serviceUtil.GetServiceRuleType(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: get rule type failed.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: get rule type failed.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if ruleNum >= 1 && ruleType != in.Rule.RuleType {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: rule type can exist one type, BLACK or WHITE.rule type is %s", in.ServiceId, in.RuleId, in.Rule.RuleType)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: rule type can exist one type, BLACK or WHITE.rule type is %s", in.ServiceId, in.RuleId, in.Rule.RuleType)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrModifyRuleNotAllow, "Exist multiple rules,can not change rule type. Rule type is "+ruleType),
 		}, nil
@@ -186,13 +187,13 @@ func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServi
 
 	rule, err := serviceUtil.GetOneRule(ctx, domainProject, in.ServiceId, in.RuleId)
 	if err != nil {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: query service rule failed.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: query service rule failed.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if rule == nil {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s:this rule does not exist,can't update.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s:this rule does not exist,can't update.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrRuleNotExists, "This rule does not exist."),
 		}, nil
@@ -216,7 +217,7 @@ func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServi
 	key := apt.GenerateServiceRuleKey(domainProject, in.ServiceId, in.RuleId)
 	data, err := json.Marshal(rule)
 	if err != nil {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: marshal service rule failed.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: marshal service rule failed.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -239,19 +240,19 @@ func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServi
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: commit data into etcd failed.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: commit data into etcd failed.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
 		}, err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: service does not exist.", in.ServiceId, in.RuleId)
+		log.Errorf(err, "update rule failed, serviceId is %s, ruleId is %s: service does not exist.", in.ServiceId, in.RuleId)
 		return &pb.UpdateServiceRuleResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	util.Logger().Infof("update rule successful: servieId is %s, ruleId is %s.", in.ServiceId, in.RuleId)
+	log.Infof("update rule successful: servieId is %s, ruleId is %s.", in.ServiceId, in.RuleId)
 	return &pb.UpdateServiceRuleResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Get service rules successfully."),
 	}, nil
@@ -260,7 +261,7 @@ func (s *MicroServiceService) UpdateRule(ctx context.Context, in *pb.UpdateServi
 func (s *MicroServiceService) GetRule(ctx context.Context, in *pb.GetServiceRulesRequest) (*pb.GetServiceRulesResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "get service rule failed, serviceId %s.", in.ServiceId)
+		log.Errorf(err, "get service rule failed, serviceId %s.", in.ServiceId)
 		return &pb.GetServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -270,7 +271,7 @@ func (s *MicroServiceService) GetRule(ctx context.Context, in *pb.GetServiceRule
 
 	// service id存在性校验
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "get service rule failed, serviceId is %s: service not exist.", in.ServiceId)
+		log.Errorf(nil, "get service rule failed, serviceId is %s: service not exist.", in.ServiceId)
 		return &pb.GetServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -278,7 +279,7 @@ func (s *MicroServiceService) GetRule(ctx context.Context, in *pb.GetServiceRule
 
 	rules, err := serviceUtil.GetRulesUtil(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get service rule failed, serviceId is %s: get rule failed.", in.ServiceId)
+		log.Errorf(err, "get service rule failed, serviceId is %s: get rule failed.", in.ServiceId)
 		return &pb.GetServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -293,7 +294,7 @@ func (s *MicroServiceService) GetRule(ctx context.Context, in *pb.GetServiceRule
 func (s *MicroServiceService) DeleteRule(ctx context.Context, in *pb.DeleteServiceRulesRequest) (*pb.DeleteServiceRulesResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "delete rule failed, serviceId is %s, ruleIds are %s.", in.ServiceId, in.RuleIds)
+		log.Errorf(err, "delete rule failed, serviceId is %s, ruleIds are %s.", in.ServiceId, in.RuleIds)
 		return &pb.DeleteServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -303,7 +304,7 @@ func (s *MicroServiceService) DeleteRule(ctx context.Context, in *pb.DeleteServi
 
 	// service id存在性校验
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "delete service rule failed, serviceId is %s, rule is %v: service does not exist.", in.ServiceId, in.RuleIds)
+		log.Errorf(nil, "delete service rule failed, serviceId is %s, rule is %v: service does not exist.", in.ServiceId, in.RuleIds)
 		return &pb.DeleteServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -314,16 +315,16 @@ func (s *MicroServiceService) DeleteRule(ctx context.Context, in *pb.DeleteServi
 	indexKey := ""
 	for _, ruleId := range in.RuleIds {
 		key = apt.GenerateServiceRuleKey(domainProject, in.ServiceId, ruleId)
-		util.Logger().Debugf("start delete service rule file: %s", key)
+		log.Debugf("start delete service rule file: %s", key)
 		data, err := serviceUtil.GetOneRule(ctx, domainProject, in.ServiceId, ruleId)
 		if err != nil {
-			util.Logger().Errorf(err, "delete service rule failed, serviceId is %s, rule is %v: get rule of ruleId %s failed.", in.ServiceId, in.RuleIds, ruleId)
+			log.Errorf(err, "delete service rule failed, serviceId is %s, rule is %v: get rule of ruleId %s failed.", in.ServiceId, in.RuleIds, ruleId)
 			return &pb.DeleteServiceRulesResponse{
 				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 			}, err
 		}
 		if data == nil {
-			util.Logger().Errorf(nil, "delete service rule failed, serviceId is %s, rule is %v: ruleId %s not exist.", in.ServiceId, in.RuleIds, ruleId)
+			log.Errorf(nil, "delete service rule failed, serviceId is %s, rule is %v: ruleId %s not exist.", in.ServiceId, in.RuleIds, ruleId)
 			return &pb.DeleteServiceRulesResponse{
 				Response: pb.CreateResponse(scerr.ErrRuleNotExists, "This rule does not exist."),
 			}, nil
@@ -334,7 +335,7 @@ func (s *MicroServiceService) DeleteRule(ctx context.Context, in *pb.DeleteServi
 			registry.OpDel(registry.WithStrKey(indexKey)))
 	}
 	if len(opts) <= 0 {
-		util.Logger().Errorf(nil, "delete service rule failed, serviceId is %s, rule is %v: rule has been deleted.", in.ServiceId, in.RuleIds)
+		log.Errorf(nil, "delete service rule failed, serviceId is %s, rule is %v: rule has been deleted.", in.ServiceId, in.RuleIds)
 		return &pb.DeleteServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrRuleNotExists, "No service rule has been deleted."),
 		}, nil
@@ -346,19 +347,19 @@ func (s *MicroServiceService) DeleteRule(ctx context.Context, in *pb.DeleteServi
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err, "delete service rule failed, serviceId is %s, rule is %v: commit data into etcd failed.", in.ServiceId, in.RuleIds)
+		log.Errorf(err, "delete service rule failed, serviceId is %s, rule is %v: commit data into etcd failed.", in.ServiceId, in.RuleIds)
 		return &pb.DeleteServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
 		}, err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(err, "delete service rule failed, serviceId is %s, rule is %v: service does not exist.", in.ServiceId, in.RuleIds)
+		log.Errorf(err, "delete service rule failed, serviceId is %s, rule is %v: service does not exist.", in.ServiceId, in.RuleIds)
 		return &pb.DeleteServiceRulesResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	util.Logger().Infof("delete rule successful: serviceId %s, ruleIds %v", in.ServiceId, in.RuleIds)
+	log.Infof("delete rule successful: serviceId %s, ruleIds %v", in.ServiceId, in.RuleIds)
 	return &pb.DeleteServiceRulesResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Delete service rules successfully."),
 	}, nil
diff --git a/server/service/schema.go b/server/service/schema.go
index 182ce4f..80b4ac2 100644
--- a/server/service/schema.go
+++ b/server/service/schema.go
@@ -18,6 +18,7 @@ package service
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -34,7 +35,7 @@ import (
 func (s *MicroServiceService) GetSchemaInfo(ctx context.Context, in *pb.GetSchemaRequest) (*pb.GetSchemaResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(nil, "get schema failed, serviceId %s, schemaId %s: invalid params.", in.ServiceId, in.SchemaId)
+		log.Errorf(nil, "get schema failed, serviceId %s, schemaId %s: invalid params.", in.ServiceId, in.SchemaId)
 		return &pb.GetSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -43,7 +44,7 @@ func (s *MicroServiceService) GetSchemaInfo(ctx context.Context, in *pb.GetSchem
 	domainProject := util.ParseDomainProject(ctx)
 
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "get schema failed, serviceId %s, schemaId %s: service not exist.", in.ServiceId, in.SchemaId)
+		log.Errorf(nil, "get schema failed, serviceId %s, schemaId %s: service not exist.", in.ServiceId, in.SchemaId)
 		return &pb.GetSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -53,13 +54,13 @@ func (s *MicroServiceService) GetSchemaInfo(ctx context.Context, in *pb.GetSchem
 	opts := append(serviceUtil.FromContext(ctx), registry.WithStrKey(key))
 	resp, errDo := backend.Store().Schema().Search(ctx, opts...)
 	if errDo != nil {
-		util.Logger().Errorf(errDo, "get schema failed, serviceId %s, schemaId %s: get schema info failed.", in.ServiceId, in.SchemaId)
+		log.Errorf(errDo, "get schema failed, serviceId %s, schemaId %s: get schema info failed.", in.ServiceId, in.SchemaId)
 		return &pb.GetSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
 		}, errDo
 	}
 	if resp.Count == 0 {
-		util.Logger().Errorf(errDo, "get schema failed, serviceId %s, schemaId %s: schema not exists.", in.ServiceId, in.SchemaId)
+		log.Errorf(errDo, "get schema failed, serviceId %s, schemaId %s: schema not exists.", in.ServiceId, in.SchemaId)
 		return &pb.GetSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrSchemaNotExists, "Do not have this schema info."),
 		}, nil
@@ -67,7 +68,7 @@ func (s *MicroServiceService) GetSchemaInfo(ctx context.Context, in *pb.GetSchem
 
 	schemaSummary, err := getSchemaSummary(ctx, domainProject, in.ServiceId, in.SchemaId)
 	if err != nil {
-		util.Logger().Errorf(err, "get schema failed, serviceId %s, schemaId %s: get schema summary failed.", in.ServiceId, in.SchemaId)
+		log.Errorf(err, "get schema failed, serviceId %s, schemaId %s: get schema summary failed.", in.ServiceId, in.SchemaId)
 		return &pb.GetSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -83,7 +84,7 @@ func (s *MicroServiceService) GetSchemaInfo(ctx context.Context, in *pb.GetSchem
 func (s *MicroServiceService) GetAllSchemaInfo(ctx context.Context, in *pb.GetAllSchemaRequest) (*pb.GetAllSchemaResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(nil, "get schema failed, serviceId %s: invalid params.", in.ServiceId)
+		log.Errorf(nil, "get schema failed, serviceId %s: invalid params.", in.ServiceId)
 		return &pb.GetAllSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -93,13 +94,13 @@ func (s *MicroServiceService) GetAllSchemaInfo(ctx context.Context, in *pb.GetAl
 
 	service, err := serviceUtil.GetService(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get all schemas failed: get service failed. %s", in.ServiceId)
+		log.Errorf(err, "get all schemas failed: get service failed. %s", in.ServiceId)
 		return &pb.GetAllSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "get all schemas failed: service does not exist. %s", in.ServiceId)
+		log.Errorf(nil, "get all schemas failed: service does not exist. %s", in.ServiceId)
 		return &pb.GetAllSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -117,7 +118,7 @@ func (s *MicroServiceService) GetAllSchemaInfo(ctx context.Context, in *pb.GetAl
 	opts := append(serviceUtil.FromContext(ctx), registry.WithStrKey(key), registry.WithPrefix())
 	resp, errDo := backend.Store().SchemaSummary().Search(ctx, opts...)
 	if errDo != nil {
-		util.Logger().Errorf(errDo, "get schema failed, serviceId %s: get schema info failed.", in.ServiceId)
+		log.Errorf(errDo, "get schema failed, serviceId %s: get schema info failed.", in.ServiceId)
 		return &pb.GetAllSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
 		}, errDo
@@ -129,7 +130,7 @@ func (s *MicroServiceService) GetAllSchemaInfo(ctx context.Context, in *pb.GetAl
 		opts := append(serviceUtil.FromContext(ctx), registry.WithStrKey(key), registry.WithPrefix())
 		respWithSchema, errDo = backend.Store().Schema().Search(ctx, opts...)
 		if errDo != nil {
-			util.Logger().Errorf(errDo, "get schema failed, serviceId %s: get schema info failed.", in.ServiceId)
+			log.Errorf(errDo, "get schema failed, serviceId %s: get schema info failed.", in.ServiceId)
 			return &pb.GetAllSchemaResponse{
 				Response: pb.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
 			}, errDo
@@ -166,7 +167,7 @@ func (s *MicroServiceService) GetAllSchemaInfo(ctx context.Context, in *pb.GetAl
 func (s *MicroServiceService) DeleteSchema(ctx context.Context, in *pb.DeleteSchemaRequest) (*pb.DeleteSchemaResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "delete schema failed, serviceId %s, schemaId %s: invalid params.", in.ServiceId, in.SchemaId)
+		log.Errorf(err, "delete schema failed, serviceId %s, schemaId %s: invalid params.", in.ServiceId, in.SchemaId)
 		return &pb.DeleteSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -174,7 +175,7 @@ func (s *MicroServiceService) DeleteSchema(ctx context.Context, in *pb.DeleteSch
 	domainProject := util.ParseDomainProject(ctx)
 
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "delete schema failed, serviceId %s, schemaId %s: service not exist.", in.ServiceId, in.SchemaId)
+		log.Errorf(nil, "delete schema failed, serviceId %s, schemaId %s: service not exist.", in.ServiceId, in.SchemaId)
 		return &pb.DeleteSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -183,13 +184,13 @@ func (s *MicroServiceService) DeleteSchema(ctx context.Context, in *pb.DeleteSch
 	key := apt.GenerateServiceSchemaKey(domainProject, in.ServiceId, in.SchemaId)
 	exist, err := serviceUtil.CheckSchemaInfoExist(ctx, key)
 	if err != nil {
-		util.Logger().Errorf(err, "delete schema failed, serviceId %s, schemaId %s: get schema failed.", in.ServiceId, in.SchemaId)
+		log.Errorf(err, "delete schema failed, serviceId %s, schemaId %s: get schema failed.", in.ServiceId, in.SchemaId)
 		return &pb.DeleteSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if !exist {
-		util.Logger().Errorf(nil, "delete schema failed, serviceId %s, schemaId %s: schema not exist.", in.ServiceId, in.SchemaId)
+		log.Errorf(nil, "delete schema failed, serviceId %s, schemaId %s: schema not exist.", in.ServiceId, in.SchemaId)
 		return &pb.DeleteSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrSchemaNotExists, "Schema info does not exist."),
 		}, nil
@@ -206,19 +207,19 @@ func (s *MicroServiceService) DeleteSchema(ctx context.Context, in *pb.DeleteSch
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if errDo != nil {
-		util.Logger().Errorf(errDo, "delete schema failed, serviceId %s, schemaId %s: delete schema from etcd failed.", in.ServiceId, in.SchemaId)
+		log.Errorf(errDo, "delete schema failed, serviceId %s, schemaId %s: delete schema from etcd failed.", in.ServiceId, in.SchemaId)
 		return &pb.DeleteSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, errDo.Error()),
 		}, errDo
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(nil, "delete schema failed, serviceId %s, schemaId %s: service does not exist.", in.ServiceId, in.SchemaId)
+		log.Errorf(nil, "delete schema failed, serviceId %s, schemaId %s: service does not exist.", in.ServiceId, in.SchemaId)
 		return &pb.DeleteSchemaResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	util.Logger().Infof("delete schema info successfully.%s", in.SchemaId)
+	log.Infof("delete schema info successfully.%s", in.SchemaId)
 	return &pb.DeleteSchemaResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Delete schema info successfully."),
 	}, nil
@@ -227,7 +228,7 @@ func (s *MicroServiceService) DeleteSchema(ctx context.Context, in *pb.DeleteSch
 func (s *MicroServiceService) ModifySchemas(ctx context.Context, in *pb.ModifySchemasRequest) (*pb.ModifySchemasResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "modify schemas failed: invalid params.")
+		log.Errorf(err, "modify schemas failed: invalid params.")
 		return &pb.ModifySchemasResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, "Invalid request."),
 		}, nil
@@ -238,13 +239,13 @@ func (s *MicroServiceService) ModifySchemas(ctx context.Context, in *pb.ModifySc
 
 	service, err := serviceUtil.GetService(ctx, domainProject, serviceId)
 	if err != nil {
-		util.Logger().Errorf(err, "modify schemas failed: get service failed. %s", serviceId)
+		log.Errorf(err, "modify schemas failed: get service failed. %s", serviceId)
 		return &pb.ModifySchemasResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "modify schemas failed: service does not exist. %s", serviceId)
+		log.Errorf(nil, "modify schemas failed: service does not exist. %s", serviceId)
 		return &pb.ModifySchemasResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -252,7 +253,7 @@ func (s *MicroServiceService) ModifySchemas(ctx context.Context, in *pb.ModifySc
 
 	respErr := modifySchemas(ctx, domainProject, service, in.Schemas)
 	if respErr != nil {
-		util.Logger().Errorf(nil, "modify schemas failed: commit data failed, serviceId %s", serviceId)
+		log.Errorf(nil, "modify schemas failed: commit data failed, serviceId %s", serviceId)
 		resp := &pb.ModifySchemasResponse{
 			Response: pb.CreateResponseWithSCErr(respErr),
 		}
@@ -324,7 +325,7 @@ func modifySchemas(ctx context.Context, domainProject string, service *pb.MicroS
 	serviceId := service.ServiceId
 	schemasFromDatabase, err := GetSchemasFromDatabase(ctx, domainProject, serviceId)
 	if err != nil {
-		util.Logger().Errorf(nil, "modify schema failed: get schema from database failed, %s", serviceId)
+		log.Errorf(nil, "modify schema failed: get schema from database failed, %s", serviceId)
 		return scerr.NewError(scerr.ErrUnavailableBackend, err.Error())
 	}
 
@@ -337,21 +338,21 @@ func modifySchemas(ctx context.Context, domainProject string, service *pb.MicroS
 			rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
 			errQuota := rst.Err
 			if errQuota != nil {
-				util.Logger().Errorf(errQuota, "modify schemas info failed, serviceId is %s", serviceId)
+				log.Errorf(errQuota, "modify schemas info failed, serviceId is %s", serviceId)
 				return errQuota
 			}
 
 			service.Schemas = nonExistSchemaIds
 			opt, err := serviceUtil.UpdateService(domainProject, serviceId, service)
 			if err != nil {
-				util.Logger().Errorf(err, "modify schemas info failed, update service failed , %s", serviceId)
+				log.Errorf(err, "modify schemas info failed, update service failed , %s", serviceId)
 				return scerr.NewError(scerr.ErrInternal, err.Error())
 			}
 			pluginOps = append(pluginOps, opt)
 		} else {
 			if len(nonExistSchemaIds) != 0 {
 				errInfo := fmt.Sprintf("non-exist schemaId %s", util.StringJoin(nonExistSchemaIds, " ,"))
-				util.Logger().Errorf(nil, "modify schemas failed, serviceId %s, %s", serviceId, errInfo)
+				log.Errorf(nil, "modify schemas failed, serviceId %s, %s", serviceId, errInfo)
 				return scerr.NewError(scerr.ErrUndefinedSchemaId, errInfo)
 			}
 			for _, needUpdateSchema := range needUpdateSchemas {
@@ -363,13 +364,13 @@ func modifySchemas(ctx context.Context, domainProject string, service *pb.MicroS
 					opts := schemaWithDatabaseOpera(registry.OpPut, domainProject, serviceId, needUpdateSchema)
 					pluginOps = append(pluginOps, opts...)
 				} else {
-					util.Logger().Warnf("schema and summary already exist, skip to update, serviceId %s, schemaId %s", serviceId, needUpdateSchema.SchemaId)
+					log.Warnf("schema and summary already exist, skip to update, serviceId %s, schemaId %s", serviceId, needUpdateSchema.SchemaId)
 				}
 			}
 		}
 
 		for _, schema := range needAddSchemas {
-			util.Logger().Infof("add new schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
+			log.Infof("add new schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
 			opts := schemaWithDatabaseOpera(registry.OpPut, domainProject, service.ServiceId, schema)
 			pluginOps = append(pluginOps, opts...)
 		}
@@ -380,28 +381,28 @@ func modifySchemas(ctx context.Context, domainProject string, service *pb.MicroS
 			rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
 			err := rst.Err
 			if err != nil {
-				util.Logger().Errorf(err, "modify schemas info failed, check resource num failed, %s", serviceId)
+				log.Errorf(err, "modify schemas info failed, check resource num failed, %s", serviceId)
 				return err
 			}
 		}
 
 		var schemaIds []string
 		for _, schema := range needAddSchemas {
-			util.Logger().Infof("add new schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
+			log.Infof("add new schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
 			opts := schemaWithDatabaseOpera(registry.OpPut, domainProject, service.ServiceId, schema)
 			pluginOps = append(pluginOps, opts...)
 			schemaIds = append(schemaIds, schema.SchemaId)
 		}
 
 		for _, schema := range needUpdateSchemas {
-			util.Logger().Infof("update schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
+			log.Infof("update schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
 			opts := schemaWithDatabaseOpera(registry.OpPut, domainProject, serviceId, schema)
 			pluginOps = append(pluginOps, opts...)
 			schemaIds = append(schemaIds, schema.SchemaId)
 		}
 
 		for _, schema := range needDeleteSchemas {
-			util.Logger().Infof("delete non-exist schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
+			log.Infof("delete non-exist schema: serviceId %s, schemaId %s", serviceId, schema.SchemaId)
 			opts := schemaWithDatabaseOpera(registry.OpDel, domainProject, serviceId, schema)
 			pluginOps = append(pluginOps, opts...)
 		}
@@ -409,7 +410,7 @@ func modifySchemas(ctx context.Context, domainProject string, service *pb.MicroS
 		service.Schemas = schemaIds
 		opt, err := serviceUtil.UpdateService(domainProject, serviceId, service)
 		if err != nil {
-			util.Logger().Errorf(err, "modify schema info failed, update service.Schemas failed , %s", serviceId)
+			log.Errorf(err, "modify schema info failed, update service.Schemas failed , %s", serviceId)
 			return scerr.NewError(scerr.ErrInternal, err.Error())
 		}
 		pluginOps = append(pluginOps, opt)
@@ -435,7 +436,7 @@ func isExistSchemaId(service *pb.MicroService, schemas []*pb.Schema) bool {
 	serviceSchemaIds := service.Schemas
 	for _, schema := range schemas {
 		if !containsValueInSlice(serviceSchemaIds, schema.SchemaId) {
-			util.Logger().Errorf(nil, "schema not exist schemaId: %s, serviceId %s", schema.SchemaId, service.ServiceId)
+			log.Errorf(nil, "schema not exist schemaId: %s, serviceId %s", schema.SchemaId, service.ServiceId)
 			return false
 		}
 	}
@@ -459,7 +460,7 @@ func GetSchemasFromDatabase(ctx context.Context, domainProject string, serviceId
 		registry.WithPrefix(),
 		registry.WithStrKey(key))
 	if err != nil {
-		util.Logger().Errorf(err, "Get schema of one service failed. %s", serviceId)
+		log.Errorf(err, "Get schema of one service failed. %s", serviceId)
 		return nil, err
 	}
 	schemas := make([]*pb.Schema, 0, len(resp.Kvs))
@@ -500,7 +501,7 @@ func (s *MicroServiceService) ModifySchema(ctx context.Context, request *pb.Modi
 	}
 	err := s.modifySchema(ctx, serviceId, &schema)
 	if err != nil {
-		util.Logger().Errorf(err, "modify schema failed, serviceId %s, schemaId %s", serviceId, schemaId)
+		log.Errorf(err, "modify schema failed, serviceId %s, schemaId %s", serviceId, schemaId)
 		resp := &pb.ModifySchemaResponse{
 			Response: pb.CreateResponseWithSCErr(err),
 		}
@@ -510,7 +511,7 @@ func (s *MicroServiceService) ModifySchema(ctx context.Context, request *pb.Modi
 		return resp, nil
 	}
 
-	util.Logger().Infof("modify schema successfully: serviceId %s, schemaId %s.", serviceId, schemaId)
+	log.Infof("modify schema successfully: serviceId %s, schemaId %s.", serviceId, schemaId)
 	return &pb.ModifySchemaResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "modify schema info success"),
 	}, nil
@@ -520,12 +521,12 @@ func (s *MicroServiceService) canModifySchema(ctx context.Context, domainProject
 	serviceId := in.ServiceId
 	schemaId := in.SchemaId
 	if len(schemaId) == 0 || len(serviceId) == 0 {
-		util.Logger().Errorf(nil, "update schema failed: invalid params.")
+		log.Errorf(nil, "update schema failed: invalid params.")
 		return scerr.NewError(scerr.ErrInvalidParams, "serviceId or schemaId is nil")
 	}
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "update schema failed, serviceId %s, schemaId %s: invalid params.", serviceId, schemaId)
+		log.Errorf(err, "update schema failed, serviceId %s, schemaId %s: invalid params.", serviceId, schemaId)
 		return scerr.NewError(scerr.ErrInvalidParams, err.Error())
 	}
 
@@ -533,11 +534,11 @@ func (s *MicroServiceService) canModifySchema(ctx context.Context, domainProject
 	rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
 	errQuota := rst.Err
 	if errQuota != nil {
-		util.Logger().Errorf(errQuota, "modify schema info failed, check resource num failed, %s, %s", serviceId, schemaId)
+		log.Errorf(errQuota, "modify schema info failed, check resource num failed, %s, %s", serviceId, schemaId)
 		return errQuota
 	}
 	if len(in.Summary) == 0 {
-		util.Logger().Warnf("service %s schema %s summary is empty.", in.ServiceId, schemaId)
+		log.Warnf("service %s schema %s summary is empty.", in.ServiceId, schemaId)
 	}
 	return nil
 }
@@ -548,11 +549,11 @@ func (s *MicroServiceService) modifySchema(ctx context.Context, serviceId string
 
 	service, err := serviceUtil.GetService(ctx, domainProject, serviceId)
 	if err != nil {
-		util.Logger().Errorf(err, "modify schema failed, serviceId %s, schemaId %s: get service failed.", serviceId, schemaId)
+		log.Errorf(err, "modify schema failed, serviceId %s, schemaId %s: get service failed.", serviceId, schemaId)
 		return scerr.NewError(scerr.ErrInternal, err.Error())
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "modify schema failed, serviceId %s, schemaId %s: service not exist", serviceId, schemaId)
+		log.Errorf(nil, "modify schema failed, serviceId %s, schemaId %s: service not exist", serviceId, schemaId)
 		return scerr.NewError(scerr.ErrServiceNotExists, "service non-exist")
 	}
 
@@ -567,23 +568,23 @@ func (s *MicroServiceService) modifySchema(ctx context.Context, serviceId string
 		key := apt.GenerateServiceSchemaKey(domainProject, serviceId, schemaId)
 		respSchema, err := backend.Store().Schema().Search(ctx, registry.WithStrKey(key), registry.WithCountOnly())
 		if err != nil {
-			util.Logger().Errorf(err, "modify schema failed, get schema summary failed, %s %s", serviceId, schemaId)
+			log.Errorf(err, "modify schema failed, get schema summary failed, %s %s", serviceId, schemaId)
 			return scerr.NewError(scerr.ErrUnavailableBackend, err.Error())
 		}
 
 		if respSchema.Count != 0 {
 			if len(schema.Summary) == 0 {
-				util.Logger().Errorf(err, "prod mode, schema already exist, can not change, %s %s", serviceId, schemaId)
+				log.Errorf(err, "prod mode, schema already exist, can not change, %s %s", serviceId, schemaId)
 				return scerr.NewError(scerr.ErrModifySchemaNotAllow, "schema already exist, can not change, environment is production")
 			}
 
 			exist, err := isExistSchemaSummary(ctx, domainProject, serviceId, schemaId)
 			if err != nil {
-				util.Logger().Errorf(err, "check schema summary is exist failed, serviceId %s, schemaId %s", serviceId, schemaId)
+				log.Errorf(err, "check schema summary is exist failed, serviceId %s, schemaId %s", serviceId, schemaId)
 				return scerr.NewError(scerr.ErrInternal, err.Error())
 			}
 			if exist {
-				util.Logger().Errorf(err, "prod mode, schema already exist, can not change, %s %s", serviceId, schemaId)
+				log.Errorf(err, "prod mode, schema already exist, can not change, %s %s", serviceId, schemaId)
 				return scerr.NewError(scerr.ErrModifySchemaNotAllow, "schema already exist, can not change, environment is production")
 			}
 		}
@@ -592,7 +593,7 @@ func (s *MicroServiceService) modifySchema(ctx context.Context, serviceId string
 			service.Schemas = append(service.Schemas, schemaId)
 			opt, err := serviceUtil.UpdateService(domainProject, serviceId, service)
 			if err != nil {
-				util.Logger().Errorf(err, "modify schema failed, update service.Schemas failed , serviceId %s, schemaId %s", serviceId, schemaId)
+				log.Errorf(err, "modify schema failed, update service.Schemas failed , serviceId %s, schemaId %s", serviceId, schemaId)
 				return scerr.NewError(scerr.ErrInternal, err.Error())
 			}
 			pluginOps = append(pluginOps, opt)
@@ -602,7 +603,7 @@ func (s *MicroServiceService) modifySchema(ctx context.Context, serviceId string
 			service.Schemas = append(service.Schemas, schemaId)
 			opt, err := serviceUtil.UpdateService(domainProject, serviceId, service)
 			if err != nil {
-				util.Logger().Errorf(err, "modify schema failed, update service.Schemas failed , serviceId %s, schemaId %s", serviceId, schemaId)
+				log.Errorf(err, "modify schema failed, update service.Schemas failed , serviceId %s, schemaId %s", serviceId, schemaId)
 				return scerr.NewError(scerr.ErrInternal, err.Error())
 			}
 			pluginOps = append(pluginOps, opt)
@@ -666,7 +667,7 @@ func getSchemaSummary(ctx context.Context, domainProject string, serviceId strin
 		registry.WithStrKey(key),
 	)
 	if err != nil {
-		util.Logger().Errorf(err, "get %s schema %s summary failed", serviceId, schemaId)
+		log.Errorf(err, "get %s schema %s summary failed", serviceId, schemaId)
 		return "", err
 	}
 	if len(resp.Kvs) == 0 {
diff --git a/server/service/tag.go b/server/service/tag.go
index a5b4a7b..aafaf82 100644
--- a/server/service/tag.go
+++ b/server/service/tag.go
@@ -18,6 +18,7 @@ package service
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -33,7 +34,7 @@ import (
 func (s *MicroServiceService) AddTags(ctx context.Context, in *pb.AddServiceTagsRequest) (*pb.AddServiceTagsResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "add service tags failed, serviceId %s, tags %v: invalid parameters.", in.ServiceId, in.Tags)
+		log.Errorf(err, "add service tags failed, serviceId %s, tags %v: invalid parameters.", in.ServiceId, in.Tags)
 		return &pb.AddServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -42,7 +43,7 @@ func (s *MicroServiceService) AddTags(ctx context.Context, in *pb.AddServiceTags
 	domainProject := util.ParseDomainProject(ctx)
 	// service id存在性校验
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "add service tags failed, serviceId %s, tags %v: service not exist.", in.ServiceId, in.Tags)
+		log.Errorf(nil, "add service tags failed, serviceId %s, tags %v: service not exist.", in.ServiceId, in.Tags)
 		return &pb.AddServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -53,7 +54,7 @@ func (s *MicroServiceService) AddTags(ctx context.Context, in *pb.AddServiceTags
 	rst := plugin.Plugins().Quota().Apply4Quotas(ctx, res)
 	errQuota := rst.Err
 	if errQuota != nil {
-		util.Logger().Errorf(errQuota, "add tag info failed, check resource num failed, %s", in.ServiceId)
+		log.Errorf(errQuota, "add tag info failed, check resource num failed, %s", in.ServiceId)
 		response := &pb.AddServiceTagsResponse{
 			Response: pb.CreateResponseWithSCErr(errQuota),
 		}
@@ -65,7 +66,7 @@ func (s *MicroServiceService) AddTags(ctx context.Context, in *pb.AddServiceTags
 
 	dataTags, err := serviceUtil.GetTagsUtils(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "add service tags failed, serviceId %s, tags %v: get existed tag failed.", in.ServiceId, in.Tags)
+		log.Errorf(err, "add service tags failed, serviceId %s, tags %v: get existed tag failed.", in.ServiceId, in.Tags)
 		return &pb.AddServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -80,7 +81,7 @@ func (s *MicroServiceService) AddTags(ctx context.Context, in *pb.AddServiceTags
 
 	checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject, in.ServiceId, dataTags)
 	if checkErr != nil {
-		util.Logger().Errorf(checkErr, "add service tags failed, serviceId %s, tags %v", in.ServiceId, in.Tags)
+		log.Errorf(checkErr, "add service tags failed, serviceId %s, tags %v", in.ServiceId, in.Tags)
 		resp := &pb.AddServiceTagsResponse{
 			Response: pb.CreateResponseWithSCErr(checkErr),
 		}
@@ -90,7 +91,7 @@ func (s *MicroServiceService) AddTags(ctx context.Context, in *pb.AddServiceTags
 		return resp, nil
 	}
 
-	util.Logger().Infof("add service tags successful, serviceId %s, tags %v.", in.ServiceId, in.Tags)
+	log.Infof("add service tags successful, serviceId %s, tags %v.", in.ServiceId, in.Tags)
 	return &pb.AddServiceTagsResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Add service tags successfully."),
 	}, nil
@@ -100,7 +101,7 @@ func (s *MicroServiceService) UpdateTag(ctx context.Context, in *pb.UpdateServic
 	tagFlag := util.StringJoin([]string{in.Key, in.Value}, "/")
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "update service tag failed, serviceId %s, tag %s: invalid params.", in.ServiceId, tagFlag)
+		log.Errorf(err, "update service tag failed, serviceId %s, tag %s: invalid params.", in.ServiceId, tagFlag)
 		return &pb.UpdateServiceTagResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -109,7 +110,7 @@ func (s *MicroServiceService) UpdateTag(ctx context.Context, in *pb.UpdateServic
 	domainProject := util.ParseDomainProject(ctx)
 
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(err, "update service tag failed, serviceId %s, tag %s: service not exist.", in.ServiceId, tagFlag)
+		log.Errorf(err, "update service tag failed, serviceId %s, tag %s: service not exist.", in.ServiceId, tagFlag)
 		return &pb.UpdateServiceTagResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -117,14 +118,14 @@ func (s *MicroServiceService) UpdateTag(ctx context.Context, in *pb.UpdateServic
 
 	tags, err := serviceUtil.GetTagsUtils(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "update service tag failed, serviceId %s, tag %s: get tag failed.", in.ServiceId, tagFlag)
+		log.Errorf(err, "update service tag failed, serviceId %s, tag %s: get tag failed.", in.ServiceId, tagFlag)
 		return &pb.UpdateServiceTagResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	//check tag 是否存在
 	if _, ok := tags[in.Key]; !ok {
-		util.Logger().Errorf(nil, "update service tag failed, serviceId %s, tag %s: tag not exist, please add first.", in.ServiceId, tagFlag)
+		log.Errorf(nil, "update service tag failed, serviceId %s, tag %s: tag not exist, please add first.", in.ServiceId, tagFlag)
 		return &pb.UpdateServiceTagResponse{
 			Response: pb.CreateResponse(scerr.ErrTagNotExists, "Update tag for service failed for update tags not exist, please add first."),
 		}, nil
@@ -133,7 +134,7 @@ func (s *MicroServiceService) UpdateTag(ctx context.Context, in *pb.UpdateServic
 
 	checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject, in.ServiceId, tags)
 	if checkErr != nil {
-		util.Logger().Errorf(checkErr, "update service tag failed, serviceId %s, tag %s.", in.ServiceId, tagFlag)
+		log.Errorf(checkErr, "update service tag failed, serviceId %s, tag %s.", in.ServiceId, tagFlag)
 		resp := &pb.UpdateServiceTagResponse{
 			Response: pb.CreateResponseWithSCErr(checkErr),
 		}
@@ -143,7 +144,7 @@ func (s *MicroServiceService) UpdateTag(ctx context.Context, in *pb.UpdateServic
 		return resp, nil
 	}
 
-	util.Logger().Infof("update tag successful, serviceId %s, tag %s.", in.ServiceId, tagFlag)
+	log.Infof("update tag successful, serviceId %s, tag %s.", in.ServiceId, tagFlag)
 	return &pb.UpdateServiceTagResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Update service tag success."),
 	}, nil
@@ -152,7 +153,7 @@ func (s *MicroServiceService) UpdateTag(ctx context.Context, in *pb.UpdateServic
 func (s *MicroServiceService) DeleteTags(ctx context.Context, in *pb.DeleteServiceTagsRequest) (*pb.DeleteServiceTagsResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "delete service tags failed, serviceId %s, tags %v: invalid params.", in.ServiceId, in.Keys)
+		log.Errorf(err, "delete service tags failed, serviceId %s, tags %v: invalid params.", in.ServiceId, in.Keys)
 		return &pb.DeleteServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -161,7 +162,7 @@ func (s *MicroServiceService) DeleteTags(ctx context.Context, in *pb.DeleteServi
 	domainProject := util.ParseDomainProject(ctx)
 
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(nil, "delete service tags failed, serviceId %s, tags %v: service not exist.", in.ServiceId, in.Keys)
+		log.Errorf(nil, "delete service tags failed, serviceId %s, tags %v: service not exist.", in.ServiceId, in.Keys)
 		return &pb.DeleteServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -169,14 +170,14 @@ func (s *MicroServiceService) DeleteTags(ctx context.Context, in *pb.DeleteServi
 
 	tags, err := serviceUtil.GetTagsUtils(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "delete service tags failed, serviceId %s, tags %v: query service failed.", in.ServiceId, in.Keys)
+		log.Errorf(err, "delete service tags failed, serviceId %s, tags %v: query service failed.", in.ServiceId, in.Keys)
 		return &pb.DeleteServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
 	}
 	for _, key := range in.Keys {
 		if _, ok := tags[key]; !ok {
-			util.Logger().Errorf(nil, "delete service tags failed, serviceId %s, tags %v: tag %s not exist.", in.ServiceId, in.Keys, key)
+			log.Errorf(nil, "delete service tags failed, serviceId %s, tags %v: tag %s not exist.", in.ServiceId, in.Keys, key)
 			return &pb.DeleteServiceTagsResponse{
 				Response: pb.CreateResponse(scerr.ErrTagNotExists, "Delete tags failed for this key "+key+" does not exist."),
 			}, nil
@@ -187,7 +188,7 @@ func (s *MicroServiceService) DeleteTags(ctx context.Context, in *pb.DeleteServi
 	// tags 可能size == 0
 	data, err := json.Marshal(tags)
 	if err != nil {
-		util.Logger().Errorf(err, "delete service tags failed, serviceId %s, tags %v: marshall service tag failed.", in.ServiceId, in.Keys)
+		log.Errorf(err, "delete service tags failed, serviceId %s, tags %v: marshall service tag failed.", in.ServiceId, in.Keys)
 		return &pb.DeleteServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
@@ -202,19 +203,19 @@ func (s *MicroServiceService) DeleteTags(ctx context.Context, in *pb.DeleteServi
 			registry.CMP_NOT_EQUAL, 0)},
 		nil)
 	if err != nil {
-		util.Logger().Errorf(err, "delete service tags failed, serviceId %s, tags %v: commit tag data into etcd failed.", in.ServiceId, in.Keys)
+		log.Errorf(err, "delete service tags failed, serviceId %s, tags %v: commit tag data into etcd failed.", in.ServiceId, in.Keys)
 		return &pb.DeleteServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrUnavailableBackend, err.Error()),
 		}, err
 	}
 	if !resp.Succeeded {
-		util.Logger().Errorf(err, "delete service properties failed, serviceId is %s, tags %v: service does not exist.", in.ServiceId, in.Keys)
+		log.Errorf(err, "delete service properties failed, serviceId is %s, tags %v: service does not exist.", in.ServiceId, in.Keys)
 		return &pb.DeleteServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
 	}
 
-	util.Logger().Infof("delete service tags successful: serviceId %s, tag %v.", in.ServiceId, in.Keys)
+	log.Infof("delete service tags successful: serviceId %s, tag %v.", in.ServiceId, in.Keys)
 	return &pb.DeleteServiceTagsResponse{
 		Response: pb.CreateResponse(pb.Response_SUCCESS, "Delete service tags successfully."),
 	}, nil
@@ -223,7 +224,7 @@ func (s *MicroServiceService) DeleteTags(ctx context.Context, in *pb.DeleteServi
 func (s *MicroServiceService) GetTags(ctx context.Context, in *pb.GetServiceTagsRequest) (*pb.GetServiceTagsResponse, error) {
 	err := Validate(in)
 	if err != nil {
-		util.Logger().Errorf(err, "get service tags failed, serviceId %s: invalid parameters.", in.ServiceId)
+		log.Errorf(err, "get service tags failed, serviceId %s: invalid parameters.", in.ServiceId)
 		return &pb.GetServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
 		}, nil
@@ -232,7 +233,7 @@ func (s *MicroServiceService) GetTags(ctx context.Context, in *pb.GetServiceTags
 	domainProject := util.ParseDomainProject(ctx)
 
 	if !serviceUtil.ServiceExist(ctx, domainProject, in.ServiceId) {
-		util.Logger().Errorf(err, "get service tags failed, serviceId %s: service not exist.", in.ServiceId)
+		log.Errorf(err, "get service tags failed, serviceId %s: service not exist.", in.ServiceId)
 		return &pb.GetServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Service does not exist."),
 		}, nil
@@ -240,7 +241,7 @@ func (s *MicroServiceService) GetTags(ctx context.Context, in *pb.GetServiceTags
 
 	tags, err := serviceUtil.GetTagsUtils(ctx, domainProject, in.ServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get service tags failed, serviceId %s: get tag failed.", in.ServiceId)
+		log.Errorf(err, "get service tags failed, serviceId %s: get tag failed.", in.ServiceId)
 		return &pb.GetServiceTagsResponse{
 			Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
 		}, err
diff --git a/server/service/util/dependency.go b/server/service/util/dependency.go
index f26f0f7..2b483ff 100644
--- a/server/service/util/dependency.go
+++ b/server/service/util/dependency.go
@@ -19,7 +19,8 @@ package util
 import (
 	"encoding/json"
 	"errors"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
@@ -40,14 +41,14 @@ type Dependency struct {
 
 func (dep *Dependency) RemoveConsumerOfProviderRule() {
 	dep.chanNum++
-	util.Go(dep.removeConsumerOfProviderRule)
+	gopool.Go(dep.removeConsumerOfProviderRule)
 }
 
 func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context) {
 	opts := make([]registry.PluginOp, 0, len(dep.removedDependencyRuleList))
 	for _, providerRule := range dep.removedDependencyRuleList {
 		proProkey := apt.GenerateProviderDependencyRuleKey(providerRule.Tenant, providerRule)
-		util.Logger().Debugf("This proProkey is %s.", proProkey)
+		log.Debugf("This proProkey is %s.", proProkey)
 		consumerValue, err := TransferToMicroServiceDependency(ctx, proProkey)
 		if err != nil {
 			dep.err <- err
@@ -58,7 +59,7 @@ func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context) {
 				consumerValue.Dependency = append(consumerValue.Dependency[:key], consumerValue.Dependency[key+1:]...)
 				break
 			}
-			util.Logger().Debugf("tmp and dep.Consumer not equal, tmp %v, consumer %v", tmp, dep.Consumer)
+			log.Debugf("tmp and dep.Consumer not equal, tmp %v, consumer %v", tmp, dep.Consumer)
 		}
 		//删除后,如果不存在依赖规则了,就删除该provider的依赖规则,如果有,则更新该依赖规则
 		if len(consumerValue.Dependency) == 0 {
@@ -67,7 +68,7 @@ func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context) {
 		}
 		data, err := json.Marshal(consumerValue)
 		if err != nil {
-			util.Logger().Errorf(nil, "Marshal tmpValue failed.")
+			log.Errorf(nil, "Marshal tmpValue failed.")
 			dep.err <- err
 			return
 		}
@@ -87,7 +88,7 @@ func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context) {
 
 func (dep *Dependency) AddConsumerOfProviderRule() {
 	dep.chanNum++
-	util.Go(dep.addConsumerOfProviderRule)
+	gopool.Go(dep.addConsumerOfProviderRule)
 }
 
 func (dep *Dependency) addConsumerOfProviderRule(ctx context.Context) {
@@ -103,7 +104,7 @@ func (dep *Dependency) addConsumerOfProviderRule(ctx context.Context) {
 
 		data, errMarshal := json.Marshal(tmpValue)
 		if errMarshal != nil {
-			util.Logger().Errorf(nil, "Marshal tmpValue failed.")
+			log.Errorf(nil, "Marshal tmpValue failed.")
 			dep.err <- errors.New("Marshal tmpValue failed.")
 			return
 		}
@@ -131,7 +132,7 @@ func (dep *Dependency) UpdateProvidersRuleOfConsumer(conKey string) error {
 			registry.WithStrKey(conKey),
 		)
 		if err != nil {
-			util.Logger().Errorf(nil, "Upload dependency rule failed.")
+			log.Errorf(nil, "Upload dependency rule failed.")
 			return err
 		}
 		return nil
@@ -142,7 +143,7 @@ func (dep *Dependency) UpdateProvidersRuleOfConsumer(conKey string) error {
 	}
 	data, err := json.Marshal(dependency)
 	if err != nil {
-		util.Logger().Errorf(nil, "Marshal tmpValue fialed.")
+		log.Errorf(nil, "Marshal tmpValue fialed.")
 		return err
 	}
 	_, err = backend.Registry().Do(context.TODO(),
@@ -150,7 +151,7 @@ func (dep *Dependency) UpdateProvidersRuleOfConsumer(conKey string) error {
 		registry.WithStrKey(conKey),
 		registry.WithValue(data))
 	if err != nil {
-		util.Logger().Errorf(nil, "Upload dependency rule failed.")
+		log.Errorf(nil, "Upload dependency rule failed.")
 		return err
 	}
 	return nil
diff --git a/server/service/util/dependency_query.go b/server/service/util/dependency_query.go
index eab4c57..88bf4c4 100644
--- a/server/service/util/dependency_query.go
+++ b/server/service/util/dependency_query.go
@@ -18,6 +18,7 @@ package util
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -85,7 +86,7 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 		for _, providerId := range providerIds {
 			provider, err := GetService(dr.ctx, key.Tenant, providerId)
 			if err != nil {
-				util.Logger().Warnf("Provider does not exist, %s/%s/%s",
+				log.Warnf("Provider does not exist, %s/%s/%s",
 					key.AppId, key.ServiceName, key.Version)
 				continue
 			}
@@ -115,7 +116,7 @@ func (dr *DependencyRelation) GetDependencyProviderIds() ([]string, error) {
 
 func (dr *DependencyRelation) getProviderKeys() ([]*pb.MicroServiceKey, error) {
 	if dr.consumer == nil {
-		util.Logger().Infof("dr.consumer is nil ------->")
+		log.Infof("dr.consumer is nil ------->")
 		return nil, fmt.Errorf("Invalid consumer")
 	}
 	consumerMicroServiceKey := pb.MicroServiceToKey(dr.domainProject, dr.consumer)
@@ -135,18 +136,18 @@ func (dr *DependencyRelation) getDependencyProviderIds(providerRules []*pb.Micro
 		switch {
 		case provider.ServiceName == "*":
 			if err != nil {
-				util.Logger().Errorf(err, "Add dependency failed, rely all service: get all services failed.")
+				log.Errorf(err, "Add dependency failed, rely all service: get all services failed.")
 				return provideServiceIds, err
 			}
 			return serviceIds, nil
 		default:
 			if err != nil {
-				util.Logger().Errorf(err, "Get providerIds failed, service: %s/%s/%s",
+				log.Errorf(err, "Get providerIds failed, service: %s/%s/%s",
 					provider.AppId, provider.ServiceName, provider.Version)
 				return provideServiceIds, err
 			}
 			if len(serviceIds) == 0 {
-				util.Logger().Warnf("Get providerIds is empty, service: %s/%s/%s does not exist",
+				log.Warnf("Get providerIds is empty, service: %s/%s/%s does not exist",
 					provider.AppId, provider.ServiceName, provider.Version)
 				continue
 			}
@@ -160,7 +161,7 @@ func (dr *DependencyRelation) parseDependencyRule(dependencyRule *pb.MicroServic
 	opts := FromContext(dr.ctx)
 	switch {
 	case dependencyRule.ServiceName == "*":
-		util.Logger().Infof("Rely all service, * type, consumerId %s", dr.consumer.ServiceId)
+		log.Infof("Rely all service, * type, consumerId %s", dr.consumer.ServiceId)
 		splited := strings.Split(apt.GenerateServiceIndexKey(dependencyRule), "/")
 		allServiceKey := util.StringJoin(splited[:len(splited)-3], "/") + "/"
 		sopts := append(opts,
@@ -183,7 +184,7 @@ func (dr *DependencyRelation) parseDependencyRule(dependencyRule *pb.MicroServic
 func (dr *DependencyRelation) GetDependencyConsumers(opts ...DependencyRelationFilterOption) ([]*pb.MicroService, error) {
 	consumerDependAllList, err := dr.getDependencyConsumersOfProvider()
 	if err != nil {
-		util.Logger().Errorf(err, "Get consumers of provider rule failed, %s", dr.provider.ServiceId)
+		log.Errorf(err, "Get consumers of provider rule failed, %s", dr.provider.ServiceId)
 		return nil, err
 	}
 	consumers := make([]*pb.MicroService, 0)
@@ -198,7 +199,7 @@ func (dr *DependencyRelation) GetDependencyConsumers(opts ...DependencyRelationF
 			return nil, err
 		}
 		if service == nil {
-			util.Logger().Warnf("Consumer does not exist, %v", consumer)
+			log.Warnf("Consumer does not exist, %v", consumer)
 			continue
 		}
 
@@ -217,7 +218,7 @@ func (dr *DependencyRelation) getServiceByMicroServiceKey(service *pb.MicroServi
 		return nil, err
 	}
 	if len(serviceId) == 0 {
-		util.Logger().Warnf("Service not exist,%v", service)
+		log.Warnf("Service not exist,%v", service)
 		return nil, nil
 	}
 	return GetService(dr.ctx, service.Tenant, serviceId)
@@ -232,11 +233,11 @@ func (dr *DependencyRelation) GetDependencyConsumerIds() ([]string, error) {
 	for _, consumer := range consumerDependAllList {
 		consumerId, err := GetServiceId(dr.ctx, consumer)
 		if err != nil {
-			util.Logger().Errorf(err, "Get consumer failed, %v", consumer)
+			log.Errorf(err, "Get consumer failed, %v", consumer)
 			return nil, err
 		}
 		if len(consumerId) == 0 {
-			util.Logger().Warnf("Get consumer not exist, %v", consumer)
+			log.Warnf("Get consumer not exist, %v", consumer)
 			continue
 		}
 		consumerIds = append(consumerIds, consumerId)
@@ -247,19 +248,19 @@ func (dr *DependencyRelation) GetDependencyConsumerIds() ([]string, error) {
 
 func (dr *DependencyRelation) getDependencyConsumersOfProvider() ([]*pb.MicroServiceKey, error) {
 	if dr.provider == nil {
-		util.Logger().Infof("dr.provider is nil ------->")
+		log.Infof("dr.provider is nil ------->")
 		return nil, fmt.Errorf("Invalid provider")
 	}
 	providerService := pb.MicroServiceToKey(dr.domainProject, dr.provider)
 	consumerDependAllList, err := dr.getConsumerOfDependAllServices()
 	if err != nil {
-		util.Logger().Errorf(err, "Get consumer that depend on all services failed, %s", dr.provider.ServiceId)
+		log.Errorf(err, "Get consumer that depend on all services failed, %s", dr.provider.ServiceId)
 		return nil, err
 	}
 
 	consumerDependList, err := dr.getConsumerOfSameServiceNameAndAppId(providerService)
 	if err != nil {
-		util.Logger().Errorf(err, "Get consumer that depend on same serviceName and appid rule failed, %s",
+		log.Errorf(err, "Get consumer that depend on same serviceName and appid rule failed, %s",
 			dr.provider.ServiceId)
 		return nil, err
 	}
@@ -274,11 +275,11 @@ func (dr *DependencyRelation) getConsumerOfDependAllServices() ([]*pb.MicroServi
 	opts := append(FromContext(dr.ctx), registry.WithStrKey(relyAllKey))
 	rsp, err := backend.Store().DependencyRule().Search(dr.ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(err, "get consumer that rely all service failed.")
+		log.Errorf(err, "get consumer that rely all service failed.")
 		return nil, err
 	}
 	if len(rsp.Kvs) != 0 {
-		util.Logger().Infof("consumer that rely all service exist.ServiceName: %s.", dr.provider.ServiceName)
+		log.Infof("consumer that rely all service exist.ServiceName: %s.", dr.provider.ServiceName)
 		return rsp.Kvs[0].Value.(*pb.MicroServiceDependency).Dependency, nil
 	}
 	return nil, nil
@@ -295,7 +296,7 @@ func (dr *DependencyRelation) getConsumerOfSameServiceNameAndAppId(provider *pb.
 		registry.WithPrefix())
 	rsp, err := backend.Store().DependencyRule().Search(dr.ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(err, "get all dependency rule failed: provider rule key %v.", provider)
+		log.Errorf(err, "get all dependency rule failed: provider rule key %v.", provider)
 		return nil, err
 	}
 
@@ -309,12 +310,12 @@ func (dr *DependencyRelation) getConsumerOfSameServiceNameAndAppId(provider *pb.
 			if latestServiceId == nil {
 				latestServiceId, _, err = FindServiceIds(dr.ctx, providerVersionRule, provider)
 				if err != nil {
-					util.Logger().Errorf(err, "Get latest service failed.")
+					log.Errorf(err, "Get latest service failed.")
 					return nil, err
 				}
 			}
 			if len(latestServiceId) == 0 {
-				util.Logger().Infof("%s 's providerId is empty,no this service.", provider.ServiceName)
+				log.Infof("%s 's providerId is empty,no this service.", provider.ServiceName)
 				continue
 			}
 			if dr.provider.ServiceId != latestServiceId[0] {
@@ -327,7 +328,7 @@ func (dr *DependencyRelation) getConsumerOfSameServiceNameAndAppId(provider *pb.
 			}
 		}
 
-		util.Logger().Debugf("providerETCD is %s", providerVersionRuleArr)
+		log.Debugf("providerETCD is %s", providerVersionRuleArr)
 		allConsumers = append(allConsumers, kv.Value.(*pb.MicroServiceDependency).Dependency...)
 	}
 	return allConsumers, nil
diff --git a/server/service/util/dependency_util.go b/server/service/util/dependency_util.go
index f7f4aae..d77a49e 100644
--- a/server/service/util/dependency_util.go
+++ b/server/service/util/dependency_util.go
@@ -20,6 +20,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -35,7 +36,7 @@ func GetConsumerIds(ctx context.Context, domainProject string, provider *pb.Micr
 	dr := NewProviderDependencyRelation(ctx, domainProject, provider)
 	consumerIds, err := dr.GetDependencyConsumerIds()
 	if err != nil {
-		util.Logger().Errorf(err, "Get dependency consumerIds failed.%s", provider.ServiceId)
+		log.Errorf(err, "Get dependency consumerIds failed.%s", provider.ServiceId)
 		return nil, err
 	}
 	return consumerIds, nil
@@ -46,7 +47,7 @@ func GetProviderIds(ctx context.Context, domainProject string, consumer *pb.Micr
 	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer)
 	providerIds, err := dr.GetDependencyProviderIds()
 	if err != nil {
-		util.Logger().Errorf(err, "Get dependency providerIds failed.%s", consumer.ServiceId)
+		log.Errorf(err, "Get dependency providerIds failed.%s", consumer.ServiceId)
 		return nil, err
 	}
 	return providerIds, nil
@@ -184,7 +185,7 @@ func AddServiceVersionRule(ctx context.Context, domainProject string, consumer *
 		return err
 	}
 	if !resp.Succeeded {
-		util.Logger().Infof("find request into dependency queue successfully, %s: %v", key, r)
+		log.Infof("find request into dependency queue successfully, %s: %v", key, r)
 	}
 	return nil
 }
@@ -197,7 +198,7 @@ func TransferToMicroServiceDependency(ctx context.Context, key string) (*pb.Micr
 	opts := append(FromContext(ctx), registry.WithStrKey(key))
 	res, err := backend.Store().DependencyRule().Search(ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(nil, "Get dependency rule failed.")
+		log.Errorf(nil, "Get dependency rule failed.")
 		return nil, err
 	}
 	if len(res.Kvs) != 0 {
@@ -234,7 +235,7 @@ func parseAddOrUpdateRules(ctx context.Context, dep *Dependency) (newDependencyR
 
 	oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
 	if err != nil {
-		util.Logger().Errorf(err, "maintain dependency rule failed, consumer %s/%s/%s: get consumer depedency rule failed.",
+		log.Errorf(err, "maintain dependency rule failed, consumer %s/%s/%s: get consumer depedency rule failed.",
 			dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version)
 		return
 	}
@@ -279,7 +280,7 @@ func parseOverrideRules(ctx context.Context, dep *Dependency) (newDependencyRule
 
 	oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
 	if err != nil {
-		util.Logger().Errorf(err, "maintain dependency rule failed, consumer %s/%s/%s: get consumer depedency rule failed.",
+		log.Errorf(err, "maintain dependency rule failed, consumer %s/%s/%s: get consumer depedency rule failed.",
 			dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version)
 		return
 	}
@@ -314,13 +315,13 @@ func syncDependencyRule(ctx context.Context, dep *Dependency, filter func(contex
 	dep.err = make(chan error, 5)
 	dep.chanNum = 0
 	if len(deleteDependencyRuleList) != 0 {
-		util.Logger().Infof("Delete dependency rule remove for consumer %s, %v, ", consumerFlag, deleteDependencyRuleList)
+		log.Infof("Delete dependency rule remove for consumer %s, %v, ", consumerFlag, deleteDependencyRuleList)
 		dep.removedDependencyRuleList = deleteDependencyRuleList
 		dep.RemoveConsumerOfProviderRule()
 	}
 
 	if len(newDependencyRuleList) != 0 {
-		util.Logger().Infof("New dependency rule add for consumer %s, %v, ", consumerFlag, newDependencyRuleList)
+		log.Infof("New dependency rule add for consumer %s, %v, ", consumerFlag, newDependencyRuleList)
 		dep.NewDependencyRuleList = newDependencyRuleList
 		dep.AddConsumerOfProviderRule()
 	}
@@ -376,7 +377,7 @@ func containServiceDependency(services []*pb.MicroServiceKey, service *pb.MicroS
 }
 
 func BadParamsResponse(detailErr string) *pb.CreateDependenciesResponse {
-	util.Logger().Errorf(nil, "Request params is invalid. %s", detailErr)
+	log.Errorf(nil, "Request params is invalid. %s", detailErr)
 	if len(detailErr) == 0 {
 		detailErr = "Request params is invalid."
 	}
@@ -390,7 +391,7 @@ func ParamsChecker(consumerInfo *pb.MicroServiceKey, providersInfo []*pb.MicroSe
 	for _, providerInfo := range providersInfo {
 		//存在带*的情况,后面的数据就不校验了
 		if providerInfo.ServiceName == "*" {
-			util.Logger().Debugf("%s 's provider contains *.", consumerInfo.ServiceName)
+			log.Debugf("%s 's provider contains *.", consumerInfo.ServiceName)
 			break
 		}
 		if len(providerInfo.AppId) == 0 {
diff --git a/server/service/util/domain_util.go b/server/service/util/domain_util.go
index bd529ca..3dff4e4 100644
--- a/server/service/util/domain_util.go
+++ b/server/service/util/domain_util.go
@@ -17,6 +17,7 @@
 package util
 
 import (
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -106,7 +107,7 @@ func NewDomainProject(ctx context.Context, domain, project string) error {
 	if !ok && err == nil {
 		ok, err = NewDomain(ctx, domain)
 		if ok {
-			util.Logger().Infof("new domain(%s)", domain)
+			log.Infof("new domain(%s)", domain)
 		}
 	}
 	if err != nil {
@@ -116,7 +117,7 @@ func NewDomainProject(ctx context.Context, domain, project string) error {
 	if !ok && err == nil {
 		ok, err = NewProject(ctx, domain, project)
 		if ok {
-			util.Logger().Infof("new project(%s/%s)", domain, project)
+			log.Infof("new project(%s/%s)", domain, project)
 		}
 	}
 	return err
diff --git a/server/service/util/instance_util.go b/server/service/util/instance_util.go
index a523c61..27ccdc0 100644
--- a/server/service/util/instance_util.go
+++ b/server/service/util/instance_util.go
@@ -19,6 +19,7 @@ package util
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -79,7 +80,7 @@ func GetAllInstancesOfOneService(ctx context.Context, domainProject string, serv
 	opts := append(FromContext(ctx), registry.WithStrKey(key), registry.WithPrefix())
 	resp, err := backend.Store().Instance().Search(ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(err, "Get instance of service %s from etcd failed.", serviceId)
+		log.Errorf(err, "Get instance of service %s from etcd failed.", serviceId)
 		return nil, err
 	}
 
@@ -98,7 +99,7 @@ func GetInstanceCountOfOneService(ctx context.Context, domainProject string, ser
 		registry.WithCountOnly())
 	resp, err := backend.Store().Instance().Search(ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(err, "Get instance count of service %s from etcd failed.", serviceId)
+		log.Errorf(err, "Get instance count of service %s from etcd failed.", serviceId)
 		return 0, err
 	}
 	return resp.Count, nil
@@ -156,11 +157,11 @@ func DeleteServiceAllInstances(ctx context.Context, serviceId string) error {
 		registry.WithPrefix(),
 		registry.WithNoCache())
 	if err != nil {
-		util.Logger().Errorf(err, "delete service %s all instance failed: get instance lease failed.", serviceId)
+		log.Errorf(err, "delete service %s all instance failed: get instance lease failed.", serviceId)
 		return err
 	}
 	if resp.Count <= 0 {
-		util.Logger().Warnf("service %s has no deployment of instance.", serviceId)
+		log.Warnf("service %s has no deployment of instance.", serviceId)
 		return nil
 	}
 	for _, v := range resp.Kvs {
@@ -177,16 +178,16 @@ func QueryAllProvidersInstances(ctx context.Context, selfServiceId string) (resu
 
 	service, err := GetService(ctx, domainProject, selfServiceId)
 	if err != nil {
-		util.Logger().Errorf(err, "get service %s failed", selfServiceId)
+		log.Errorf(err, "get service %s failed", selfServiceId)
 		return
 	}
 	if service == nil {
-		util.Logger().Errorf(nil, "service not exist, %s", selfServiceId)
+		log.Errorf(nil, "service not exist, %s", selfServiceId)
 		return
 	}
 	providerIds, _, err := GetAllProviderIds(ctx, domainProject, service)
 	if err != nil {
-		util.Logger().Errorf(err, "get service %s providers id set failed.", selfServiceId)
+		log.Errorf(err, "get service %s providers id set failed.", selfServiceId)
 		return
 	}
 
@@ -195,7 +196,7 @@ func QueryAllProvidersInstances(ctx context.Context, selfServiceId string) (resu
 	for _, providerId := range providerIds {
 		service, err := GetServiceWithRev(ctx, domainProject, providerId, rev)
 		if err != nil {
-			util.Logger().Errorf(err, "get service %s provider service %s file with revision %d failed.",
+			log.Errorf(err, "get service %s provider service %s file with revision %d failed.",
 				selfServiceId, providerId, rev)
 			return
 		}
@@ -205,7 +206,7 @@ func QueryAllProvidersInstances(ctx context.Context, selfServiceId string) (resu
 
 		kvs, err := queryServiceInstancesKvs(ctx, providerId, rev)
 		if err != nil {
-			util.Logger().Errorf(err, "get service %s provider %s instances with revision %d failed.",
+			log.Errorf(err, "get service %s provider %s instances with revision %d failed.",
 				selfServiceId, providerId, rev)
 			return
 		}
@@ -235,7 +236,7 @@ func queryServiceInstancesKvs(ctx context.Context, serviceId string, rev int64)
 		registry.WithPrefix(),
 		registry.WithRev(rev))
 	if err != nil {
-		util.Logger().Errorf(err, "query instance of service %s with revision %d from etcd failed.",
+		log.Errorf(err, "query instance of service %s with revision %d from etcd failed.",
 			serviceId, rev)
 		return nil, err
 	}
diff --git a/server/service/util/microservice_util.go b/server/service/util/microservice_util.go
index e5a89a9..e9aab49 100644
--- a/server/service/util/microservice_util.go
+++ b/server/service/util/microservice_util.go
@@ -18,6 +18,7 @@ package util
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -89,7 +90,7 @@ func GetServiceId(ctx context.Context, key *pb.MicroServiceKey) (serviceId strin
 	}
 	if len(serviceId) == 0 {
 		// 别名查询
-		util.Logger().Debugf("could not search microservice %s/%s/%s id by field 'serviceName', now try field 'alias'.",
+		log.Debugf("could not search microservice %s/%s/%s id by field 'serviceName', now try field 'alias'.",
 			key.AppId, key.ServiceName, key.Version)
 		return searchServiceIdFromAlias(ctx, key)
 	}
@@ -210,7 +211,7 @@ func UpdateService(domainProject string, serviceId string, service *pb.MicroServ
 	key := apt.GenerateServiceKey(domainProject, serviceId)
 	data, err := json.Marshal(service)
 	if err != nil {
-		util.Logger().Errorf(err, "marshal service failed.")
+		log.Errorf(err, "marshal service failed.")
 		return
 	}
 	opt = registry.OpPut(registry.WithStrKey(key), registry.WithValue(data))
diff --git a/server/service/util/rule_util.go b/server/service/util/rule_util.go
index 3d76855..82bbd54 100644
--- a/server/service/util/rule_util.go
+++ b/server/service/util/rule_util.go
@@ -18,6 +18,7 @@ package util
 
 import (
 	"fmt"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -122,7 +123,7 @@ func GetServiceRuleType(ctx context.Context, domainProject string, serviceId str
 		registry.WithPrefix())
 	resp, err := backend.Store().Rule().Search(ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(err, "Get rule failed.%s", err.Error())
+		log.Errorf(err, "Get rule failed.%s", err.Error())
 		return "", 0, err
 	}
 	if len(resp.Kvs) == 0 {
@@ -136,11 +137,11 @@ func GetOneRule(ctx context.Context, domainProject, serviceId, ruleId string) (*
 		registry.WithStrKey(apt.GenerateServiceRuleKey(domainProject, serviceId, ruleId)))
 	resp, err := backend.Store().Rule().Search(ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(nil, "Get rule for service failed for %s.", err.Error())
+		log.Errorf(nil, "Get rule for service failed for %s.", err.Error())
 		return nil, err
 	}
 	if len(resp.Kvs) == 0 {
-		util.Logger().Errorf(nil, "Get rule failed, ruleId is %s.", ruleId)
+		log.Errorf(nil, "Get rule failed, ruleId is %s.", ruleId)
 		return nil, nil
 	}
 	return resp.Kvs[0].Value.(*pb.ServiceRule), nil
@@ -193,7 +194,7 @@ func patternWhiteList(rulesOfProvider []*pb.ServiceRule, tagsOfConsumer map[stri
 
 		match, _ := regexp.MatchString(rule.Pattern, value)
 		if match {
-			util.Logger().Infof("consumer %s match white list, rule.Pattern is %s, value is %s",
+			log.Infof("consumer %s match white list, rule.Pattern is %s, value is %s",
 				consumerId, rule.Pattern, value)
 			return nil
 		}
@@ -206,13 +207,13 @@ func parsePattern(v reflect.Value, rule *pb.ServiceRule, tagsOfConsumer map[stri
 		key := rule.Attribute[4:]
 		value := tagsOfConsumer[key]
 		if len(value) == 0 {
-			util.Logger().Infof("can not find service %s tag '%s'", consumerId, key)
+			log.Infof("can not find service %s tag '%s'", consumerId, key)
 		}
 		return value, nil
 	}
 	key := v.FieldByName(rule.Attribute)
 	if !key.IsValid() {
-		util.Logger().Errorf(nil, "can not find service %s field '%s', rule %s",
+		log.Errorf(nil, "can not find service %s field '%s', rule %s",
 			consumerId, rule.Attribute, rule.RuleId)
 		return "", scerr.NewErrorf(scerr.ErrInternal, "Can not find field '%s'", rule.Attribute)
 	}
@@ -235,7 +236,7 @@ func patternBlackList(rulesOfProvider []*pb.ServiceRule, tagsOfConsumer map[stri
 
 		match, _ := regexp.MatchString(rule.Pattern, value)
 		if match {
-			util.Logger().Warnf("no permission to access, consumer %s match black list, rule.Pattern is %s, value is %s",
+			log.Warnf("no permission to access, consumer %s match black list, rule.Pattern is %s, value is %s",
 				consumerId, rule.Pattern, value)
 			return scerr.NewError(scerr.ErrPermissionDeny, "Found in black list")
 		}
diff --git a/server/service/util/tag_util.go b/server/service/util/tag_util.go
index 440dda2..859c019 100644
--- a/server/service/util/tag_util.go
+++ b/server/service/util/tag_util.go
@@ -18,6 +18,7 @@ package util
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -53,7 +54,7 @@ func GetTagsUtils(ctx context.Context, domainProject, serviceId string) (tags ma
 	opts := append(FromContext(ctx), registry.WithStrKey(key))
 	resp, err := backend.Store().ServiceTag().Search(ctx, opts...)
 	if err != nil {
-		util.Logger().Errorf(err, "get service %s tags file failed", key)
+		log.Errorf(err, "get service %s tags file failed", key)
 		return tags, err
 	}
 
diff --git a/server/service/validate.go b/server/service/validate.go
index f6b9c2d..4c681d6 100644
--- a/server/service/validate.go
+++ b/server/service/validate.go
@@ -18,7 +18,7 @@ package service
 
 import (
 	"errors"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
 	"reflect"
 )
@@ -91,7 +91,7 @@ func Validate(v interface{}) error {
 	case *pb.GetAppsRequest:
 		return MicroServiceKeyValidator().Validate(v)
 	default:
-		util.Logger().Warnf("No validator for %T.", t)
+		log.Warnf("No validator for %T.", t)
 		return nil
 	}
 }
diff --git a/server/service/watch.go b/server/service/watch.go
index 97fd9c3..0ceccaf 100644
--- a/server/service/watch.go
+++ b/server/service/watch.go
@@ -18,6 +18,7 @@ package service
 
 import (
 	"errors"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
 	apt "github.com/apache/incubator-servicecomb-service-center/server/core"
 	pb "github.com/apache/incubator-servicecomb-service-center/server/core/proto"
@@ -41,18 +42,18 @@ func (s *InstanceService) WatchPreOpera(ctx context.Context, in *pb.WatchInstanc
 func (s *InstanceService) Watch(in *pb.WatchInstanceRequest, stream pb.ServiceInstanceCtrl_WatchServer) error {
 	var err error
 	if err = s.WatchPreOpera(stream.Context(), in); err != nil {
-		util.Logger().Errorf(err, "establish watch failed: invalid params.")
+		log.Errorf(err, "establish watch failed: invalid params.")
 		return err
 	}
 	domainProject := util.ParseDomainProject(stream.Context())
 	watcher := nf.NewListWatcher(in.SelfServiceId, apt.GetInstanceRootKey(domainProject)+"/", nil)
 	err = nf.GetNotifyService().AddSubscriber(watcher)
-	util.Logger().Infof("start watch instance status, watcher %s %s", watcher.Subject(), watcher.Group())
+	log.Infof("start watch instance status, watcher %s %s", watcher.Subject(), watcher.Group())
 	return nf.HandleWatchJob(watcher, stream)
 }
 
 func (s *InstanceService) WebSocketWatch(ctx context.Context, in *pb.WatchInstanceRequest, conn *websocket.Conn) {
-	util.Logger().Infof("new a web socket watch with %s", in.SelfServiceId)
+	log.Infof("new a web socket watch with %s", in.SelfServiceId)
 	if err := s.WatchPreOpera(ctx, in); err != nil {
 		nf.EstablishWebSocketError(conn, err)
 		return
@@ -61,7 +62,7 @@ func (s *InstanceService) WebSocketWatch(ctx context.Context, in *pb.WatchInstan
 }
 
 func (s *InstanceService) WebSocketListAndWatch(ctx context.Context, in *pb.WatchInstanceRequest, conn *websocket.Conn) {
-	util.Logger().Infof("new a web socket list and watch with %s", in.SelfServiceId)
+	log.Infof("new a web socket list and watch with %s", in.SelfServiceId)
 	if err := s.WatchPreOpera(ctx, in); err != nil {
 		nf.EstablishWebSocketError(conn, err)
 		return
diff --git a/server/version.go b/server/version.go
index 507bef6..090d090 100644
--- a/server/version.go
+++ b/server/version.go
@@ -18,7 +18,7 @@ package server
 
 import (
 	"encoding/json"
-	"github.com/apache/incubator-servicecomb-service-center/pkg/util"
+	"github.com/apache/incubator-servicecomb-service-center/pkg/log"
 	"github.com/apache/incubator-servicecomb-service-center/server/core"
 	"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
 	"github.com/apache/incubator-servicecomb-service-center/server/infra/registry"
@@ -37,7 +37,7 @@ func LoadServerVersion() error {
 
 	err = json.Unmarshal(resp.Kvs[0].Value, &core.ServerInfo)
 	if err != nil {
-		util.Logger().Errorf(err, "load server version failed, maybe incompatible")
+		log.Errorf(err, "load server version failed, maybe incompatible")
 		return nil
 	}
 	return nil