[VOL-2471] Update library to use package logger

This commit consists of the following:
1) Add a GetLogLevel() API to make it easier to use specific
logger.   There is also the V() API that kind of do something
similar.
2) Add a common.go file to some heavily used packages in order
to dynamically set their log level and also to a set a specific
logger per package.
3) Use a per package logger for some of the heavily used packages
for improved performance.

Change-Id: If22a2c82d87d808f305677a2e793f8064f33291e
diff --git a/pkg/mocks/common.go b/pkg/mocks/common.go
index c20dab1..d6d4062 100644
--- a/pkg/mocks/common.go
+++ b/pkg/mocks/common.go
@@ -20,14 +20,15 @@
 )
 
 const (
-	logLevel = log.FatalLevel
+	logLevel = log.ErrorLevel
 )
 
-// Unit test initialization. This init() function handles all unit tests in
-// the current directory.
+var logger log.Logger
+
 func init() {
 	// Setup this package so that it's log level can be modified at run time
-	_, err := log.AddPackage(log.JSON, logLevel, log.Fields{"pkg": "mocks"})
+	var err error
+	logger, err = log.AddPackage(log.JSON, logLevel, log.Fields{"pkg": "mocks"})
 	if err != nil {
 		panic(err)
 	}
diff --git a/pkg/mocks/etcd_server.go b/pkg/mocks/etcd_server.go
index 3246ca0..487b991 100644
--- a/pkg/mocks/etcd_server.go
+++ b/pkg/mocks/etcd_server.go
@@ -18,7 +18,6 @@
 import (
 	"fmt"
 	"go.etcd.io/etcd/embed"
-	"log"
 	"net/url"
 	"os"
 	"time"
@@ -58,19 +57,19 @@
 	cfg.Dir = localPersistentStorageDir
 	cfg.Logger = "zap"
 	if !islogLevelValid(logLevel) {
-		log.Fatalf("Invalid log level -%s", logLevel)
+		logger.Fatalf("Invalid log level -%s", logLevel)
 	}
 	cfg.LogLevel = logLevel
 	acurl, err := url.Parse(fmt.Sprintf("http://localhost:%d", clientPort))
 	if err != nil {
-		log.Fatalf("Invalid client port -%d", clientPort)
+		logger.Fatalf("Invalid client port -%d", clientPort)
 	}
 	cfg.ACUrls = []url.URL{*acurl}
 	cfg.LCUrls = []url.URL{*acurl}
 
 	apurl, err := url.Parse(fmt.Sprintf("http://localhost:%d", peerPort))
 	if err != nil {
-		log.Fatalf("Invalid peer port -%d", peerPort)
+		logger.Fatalf("Invalid peer port -%d", peerPort)
 	}
 	cfg.LPUrls = []url.URL{*apurl}
 	cfg.APUrls = []url.URL{*apurl}
@@ -100,23 +99,23 @@
 	// Remove the local directory as
 	// a safeguard for the case where a prior test failed
 	if err := os.RemoveAll(cfg.Dir); err != nil {
-		log.Fatalf("Failure removing local directory %s", cfg.Dir)
+		logger.Fatalf("Failure removing local directory %s", cfg.Dir)
 	}
 	e, err := embed.StartEtcd(cfg)
 	if err != nil {
-		log.Fatal(err)
+		logger.Fatal(err)
 	}
 	select {
 	case <-e.Server.ReadyNotify():
-		log.Printf("Embedded Etcd server is ready!")
+		logger.Debug("Embedded Etcd server is ready!")
 	case <-time.After(serverStartUpTimeout):
 		e.Server.HardStop() // trigger a shutdown
 		e.Close()
-		log.Fatal("Embedded Etcd server took too long to start!")
+		logger.Fatal("Embedded Etcd server took too long to start!")
 	case err := <-e.Err():
 		e.Server.HardStop() // trigger a shutdown
 		e.Close()
-		log.Fatalf("Embedded Etcd server errored out - %s", err)
+		logger.Fatalf("Embedded Etcd server errored out - %s", err)
 	}
 	return &EtcdServer{server: e}
 }
@@ -128,7 +127,7 @@
 		es.server.Server.HardStop()
 		es.server.Close()
 		if err := os.RemoveAll(storage); err != nil {
-			log.Fatalf("Failure removing local directory %s", es.server.Config().Dir)
+			logger.Fatalf("Failure removing local directory %s", es.server.Config().Dir)
 		}
 	}
 }
diff --git a/pkg/mocks/etcd_server_test.go b/pkg/mocks/etcd_server_test.go
index 0463daa..90a3654 100644
--- a/pkg/mocks/etcd_server_test.go
+++ b/pkg/mocks/etcd_server_test.go
@@ -21,7 +21,6 @@
 	"github.com/opencord/voltha-lib-go/v2/pkg/db/kvstore"
 	"github.com/phayes/freeport"
 	"github.com/stretchr/testify/assert"
-	"log"
 	"os"
 	"testing"
 )
@@ -32,21 +31,21 @@
 func setup() {
 	clientPort, err := freeport.GetFreePort()
 	if err != nil {
-		log.Fatal(err)
+		logger.Fatal(err)
 	}
 	peerPort, err := freeport.GetFreePort()
 	if err != nil {
-		log.Fatal(err)
+		logger.Fatal(err)
 	}
 	etcdServer = StartEtcdServer(MKConfig("voltha.mock.test", clientPort, peerPort, "voltha.lib.mocks.etcd", "error"))
 	if etcdServer == nil {
-		log.Fatal("Embedded server failed to start")
+		logger.Fatal("Embedded server failed to start")
 	}
 	clientAddr := fmt.Sprintf("localhost:%d", clientPort)
 	client, err = kvstore.NewEtcdClient(clientAddr, 10)
 	if err != nil || client == nil {
 		etcdServer.Stop()
-		log.Fatal("Failed to create an Etcd client")
+		logger.Fatal("Failed to create an Etcd client")
 	}
 }
 
diff --git a/pkg/mocks/kafka_client.go b/pkg/mocks/kafka_client.go
index 87dd9e8..381c093 100644
--- a/pkg/mocks/kafka_client.go
+++ b/pkg/mocks/kafka_client.go
@@ -38,7 +38,7 @@
 }
 
 func (kc *KafkaClient) Start() error {
-	log.Debug("kafka-client-started")
+	logger.Debug("kafka-client-started")
 	return nil
 }
 
@@ -51,11 +51,11 @@
 		}
 		delete(kc.topicsChannelMap, topic)
 	}
-	log.Debug("kafka-client-stopped")
+	logger.Debug("kafka-client-stopped")
 }
 
 func (kc *KafkaClient) CreateTopic(topic *kafka.Topic, numPartition int, repFactor int) error {
-	log.Debugw("CreatingTopic", log.Fields{"topic": topic.Name, "numPartition": numPartition, "replicationFactor": repFactor})
+	logger.Debugw("CreatingTopic", log.Fields{"topic": topic.Name, "numPartition": numPartition, "replicationFactor": repFactor})
 	kc.lock.Lock()
 	defer kc.lock.Unlock()
 	if _, ok := kc.topicsChannelMap[topic.Name]; ok {
@@ -67,7 +67,7 @@
 }
 
 func (kc *KafkaClient) DeleteTopic(topic *kafka.Topic) error {
-	log.Debugw("DeleteTopic", log.Fields{"topic": topic.Name})
+	logger.Debugw("DeleteTopic", log.Fields{"topic": topic.Name})
 	kc.lock.Lock()
 	defer kc.lock.Unlock()
 	delete(kc.topicsChannelMap, topic.Name)
@@ -75,7 +75,7 @@
 }
 
 func (kc *KafkaClient) Subscribe(topic *kafka.Topic, kvArgs ...*kafka.KVArg) (<-chan *ic.InterContainerMessage, error) {
-	log.Debugw("Subscribe", log.Fields{"topic": topic.Name, "args": kvArgs})
+	logger.Debugw("Subscribe", log.Fields{"topic": topic.Name, "args": kvArgs})
 	kc.lock.Lock()
 	defer kc.lock.Unlock()
 	ch := make(chan *ic.InterContainerMessage)
@@ -89,7 +89,7 @@
 }
 
 func (kc *KafkaClient) UnSubscribe(topic *kafka.Topic, ch <-chan *ic.InterContainerMessage) error {
-	log.Debugw("UnSubscribe", log.Fields{"topic": topic.Name})
+	logger.Debugw("UnSubscribe", log.Fields{"topic": topic.Name})
 	kc.lock.Lock()
 	defer kc.lock.Unlock()
 	if chnls, ok := kc.topicsChannelMap[topic.Name]; ok {
@@ -118,7 +118,7 @@
 	kc.lock.RLock()
 	defer kc.lock.RUnlock()
 	for _, ch := range kc.topicsChannelMap[topic.Name] {
-		log.Debugw("Publishing", log.Fields{"fromTopic": req.Header.FromTopic, "toTopic": topic.Name, "id": req.Header.Id})
+		logger.Debugw("Publishing", log.Fields{"fromTopic": req.Header.FromTopic, "toTopic": topic.Name, "id": req.Header.Id})
 		ch <- req
 	}
 	return nil