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

[GitHub] little-cui closed pull request #416: SCB-848 Uses zap to replace the paas-lager

little-cui closed pull request #416: SCB-848 Uses zap to replace the paas-lager
URL: https://github.com/apache/incubator-servicecomb-service-center/pull/416
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/.gitignore b/.gitignore
index 8bb0528a..e679e2d3 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 c4dada96..8051f717 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 37e5ef59..e48e16a3 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 8cfb4dd9..51441feb 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 5efdab7f..bb3ea826 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 81070f8f..7c4bd5bf 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 03d3d43f..0d01c7b9 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 997ca95d..bfdb4e74 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 2d188559..46b3ef2d 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 00000000..2d88a077
--- /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 00000000..aac012d4
--- /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 00000000..1ff57728
--- /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 00000000..5b15281e
--- /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 00000000..198d0b3a
--- /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 00000000..1ba8fc62
--- /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 138677d0..3bc95714 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 4ffad2ff..312e518e 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 00000000..8f42c9eb
--- /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 f5a3bbac..493f46de 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 e4b2c4f3..aa68380e 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 9bafcfad..c4413d23 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 56f7423a..e443a890 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 f217fad9..b3b1dc8b 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 084fe44b..f00e59df 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 0bcabb60..6b5841f4 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 6e242855..bf2c4063 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 53f8007d..4677bfe8 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 4995ecd8..fcf444df 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 9f1da953..00000000
--- 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 9d0bdbf7..00000000
--- 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 7ea324da..f45572ab 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 7100e2e1..9bd81ef7 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 d1dfd0cb..42d34f05 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 5c9fb109..a2fa902f 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 00000000..8d6bb4a4
--- /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 00000000..721b703b
--- /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 00000000..20dcf51d
--- /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 00000000..2cf16382
--- /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 166a0571..2a6554e0 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 7f7bdcb7..e5c54296 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 f0efb35a..e0c40709 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 ec0a96a0..dac2b2a8 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 9b433414..f09c4aa3 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 2b147359..d7682059 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 7f97b677..2394a4fc 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 82455ec6..6f8bbed7 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 095c5b87..dc4ac0aa 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 4496137f..61d16af3 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 d1fb7662..c627ee33 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 928e95df..106de63c 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 70b7234a..5cf401a7 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 6eb01e7f..8c175bac 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 40ec466a..683e442b 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 8562ada6..1b6bf98c 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 93d29cc2..23d32194 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 247a35bf..7384a650 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 c01217de..8ccd64c1 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 c4c10d93..f0630061 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 7fea2c27..95b34dfe 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 6dc977e9..0fdc76b0 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 b4f8bb43..ec61a986 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 62adac54..13027d2f 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 079bc776..6d3b8c18 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 30441ef7..c4868820 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 c3abb8b4..4d07baef 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 1dd6d80e..d19a8493 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 0ca83161..a4eb7b0c 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 5b269e15..d31ef8c5 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 00000000..a3c13a74
--- /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 b640ec15..7658284a 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 3794da00..fd9a0d52 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 f39257a5..20e7525a 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 1786a704..e08f8e5a 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 349614d4..6e04df8a 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 67ae48a4..037695f9 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 12753b49..6ffc09dd 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 14e30f7e..64f410fd 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 4de5588b..e0a45fe5 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 c7fd087c..c5cd6b98 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 e4eb8049..9627f794 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 2d3b601d..277edf23 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 288b0499..85bfb26f 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 9206df9c..4495226a 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 60b4d7cd..9cc450af 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 539ce4d0..1370ed79 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 71e4cde0..6292c63b 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 71704989..d32d6e56 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 ec5bb488..49115f29 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 ae7ef967..40ced008 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 fec8d08d..f8048d02 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 1c386762..d82583ba 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 ef859440..3beae379 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 da418c8d..5139db18 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 df9da3d0..b65d0cae 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 4c13dd0c..31beb926 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 235fa028..f4552aea 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 b6605086..a66db695 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 e2bc6874..de88fc8c 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 613a087d..dcb08f5e 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 aecf7cbc..101b2248 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 fe1ef032..9e61229a 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 cd88ff8e..ab9b0b71 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 bffbb457..feffe640 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 597713c0..ddd84af8 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 8837396b..e28fc912 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 014e06e9..97527a16 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 7fe27f1d..a0fd53d3 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 da4bd860..ed5f2702 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 17bab452..861e8630 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 f215553b..da44f3ef 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 00778ea9..deafd5fe 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 42b2ce72..40ca4bdc 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 182ce4f3..80b4ac2d 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 a5b4a7b6..aafaf82b 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 f26f0f7b..2b483ff8 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 eab4c57d..88bf4c49 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 f7f4aae3..d77a49e9 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 bd529ca0..3dff4e47 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 a523c61a..27ccdc00 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 e5a89a92..e9aab498 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 3d768553..82bbd54b 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 440dda29..859c019d 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 f6b9c2de..4c681d69 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 97fd9c36..0ceccaf8 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 507bef64..090d090f 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


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services