Add SetLogger method (#290)

* add coverage status label

* add SetLogger method
diff --git a/README.md b/README.md
index 0db29fa..fc59306 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
 ## RocketMQ Client Go
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
-[![TravisCI](https://travis-ci.org/apache/rocketmq-client-python.svg)](https://travis-ci.org/apache/rocketmq-client-go)
+[![TravisCI](https://travis-ci.org/apache/rocketmq-client-go.svg)](https://travis-ci.org/apache/rocketmq-client-go)
+[![Coverage](https://codecov.io/gh/apache/rocketmq-client-go/branch/native/graph/badge.svg)](https://codecov.io/gh/apache/rocketmq-client-go/branch/native)
 
 The RocketMQ Client in pure go, the project is developing, **there is no any guarantee in production environment**. in next versions,
 we will do our best to improve reliability, stability, usability and performance. the API may be changed, and more features will be added.
diff --git a/internal/route.go b/internal/route.go
index 95abecc..5851f85 100644
--- a/internal/route.go
+++ b/internal/route.go
@@ -121,7 +121,7 @@
 	if err != nil {
 		routeData, err = s.queryTopicRouteInfoFromServer(defaultTopic)
 		if err != nil {
-			rlog.Warning("query topic route from server error: %s", map[string]interface{}{
+			rlog.Warning("query topic route from server error", map[string]interface{}{
 				rlog.LogKeyUnderlayError: err,
 			})
 			return nil
diff --git a/rlog/log.go b/rlog/log.go
index 72a4a01..426f698 100644
--- a/rlog/log.go
+++ b/rlog/log.go
@@ -18,6 +18,9 @@
 package rlog
 
 import (
+	"os"
+	"strings"
+
 	"github.com/sirupsen/logrus"
 )
 
@@ -44,10 +47,21 @@
 	r := &defaultLogger{
 		logger: logrus.New(),
 	}
+	level := os.Getenv("ROCKETMQ_GO_LOG_LEVEL")
+	switch strings.ToLower(level) {
+	case "debug":
+		r.logger.SetLevel(logrus.DebugLevel)
+	case "warn":
+		r.logger.SetLevel(logrus.WarnLevel)
+	case "error":
+		r.logger.SetLevel(logrus.ErrorLevel)
+	default:
+		r.logger.SetLevel(logrus.InfoLevel)
+	}
 	rLog = r
 }
 
-var rLog *defaultLogger
+var rLog Logger
 
 type defaultLogger struct {
 	logger *logrus.Logger
@@ -57,35 +71,40 @@
 	if msg == "" && len(fields) == 0 {
 		return
 	}
-	rLog.logger.WithFields(fields).Debug(msg)
+	l.logger.WithFields(fields).Debug(msg)
 }
 
 func (l *defaultLogger) Info(msg string, fields map[string]interface{}) {
 	if msg == "" && len(fields) == 0 {
 		return
 	}
-	rLog.logger.WithFields(fields).Info(msg)
+	l.logger.WithFields(fields).Info(msg)
 }
 
 func (l *defaultLogger) Warning(msg string, fields map[string]interface{}) {
 	if msg == "" && len(fields) == 0 {
 		return
 	}
-	rLog.logger.WithFields(fields).Warning(msg)
+	l.logger.WithFields(fields).Warning(msg)
 }
 
 func (l *defaultLogger) Error(msg string, fields map[string]interface{}) {
 	if msg == "" && len(fields) == 0 {
 		return
 	}
-	rLog.logger.WithFields(fields).WithFields(fields).Error(msg)
+	l.logger.WithFields(fields).WithFields(fields).Error(msg)
 }
 
 func (l *defaultLogger) Fatal(msg string, fields map[string]interface{}) {
 	if msg == "" && len(fields) == 0 {
 		return
 	}
-	rLog.logger.WithFields(fields).Fatal(msg)
+	l.logger.WithFields(fields).Fatal(msg)
+}
+
+// SetLogger use specified logger user customized, in general, we suggest user to replace the default logger with specified
+func SetLogger(logger Logger) {
+	rLog = logger
 }
 
 func Debug(msg string, fields map[string]interface{}) {