[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/log/log.go b/pkg/log/log.go
index 026c6c0..43567e3 100644
--- a/pkg/log/log.go
+++ b/pkg/log/log.go
@@ -107,6 +107,9 @@
 
 	// V reports whether verbosity level l is at least the requested verbose level.
 	V(l int) bool
+
+	//Returns the log level of this specific logger
+	GetLogLevel() int
 }
 
 // Fields is used as key-value pairs for structured logging
@@ -119,8 +122,9 @@
 var cfgs map[string]zp.Config
 
 type logger struct {
-	log    *zp.SugaredLogger
-	parent *zp.Logger
+	log         *zp.SugaredLogger
+	parent      *zp.Logger
+	packageName string
 }
 
 func intToAtomicLevel(l int) zp.AtomicLevel {
@@ -266,8 +270,9 @@
 	}
 
 	loggers[pkgName] = &logger{
-		log:    l.Sugar(),
-		parent: l,
+		log:         l.Sugar(),
+		parent:      l,
+		packageName: pkgName,
 	}
 	return loggers[pkgName], nil
 }
@@ -287,8 +292,9 @@
 		}
 
 		loggers[pkgName] = &logger{
-			log:    l.Sugar(),
-			parent: l,
+			log:         l.Sugar(),
+			parent:      l,
+			packageName: pkgName,
 		}
 	}
 	return nil
@@ -334,8 +340,9 @@
 
 	// Set the logger
 	loggers[pkgName] = &logger{
-		log:    l.Sugar(),
-		parent: l,
+		log:         l.Sugar(),
+		parent:      l,
+		packageName: pkgName,
 	}
 	return loggers[pkgName], nil
 }
@@ -638,6 +645,11 @@
 	return l.parent.Core().Enabled(intToLevel(level))
 }
 
+// GetLogLevel returns the current level of the logger
+func (l logger) GetLogLevel() int {
+	return levelToInt(cfgs[l.packageName].Level.Level())
+}
+
 // With returns a logger initialized with the key-value pairs
 func With(keysAndValues Fields) Logger {
 	return logger{log: getPackageLevelSugaredLogger().With(serializeMap(keysAndValues)...), parent: defaultLogger.parent}
@@ -767,3 +779,8 @@
 func V(level int) bool {
 	return getPackageLevelLogger().V(level)
 }
+
+//GetLogLevel returns the log level of the invoking package
+func GetLogLevel() int {
+	return getPackageLevelLogger().GetLogLevel()
+}
diff --git a/pkg/log/log_test.go b/pkg/log/log_test.go
index 5ca0955..f32c55e 100644
--- a/pkg/log/log_test.go
+++ b/pkg/log/log_test.go
@@ -91,6 +91,19 @@
 			l, err := GetPackageLogLevel(name)
 			assert.Nil(t, err)
 			assert.Equal(t, l, expectedLevel)
+			// Get the package log level by invoking the specific logger created for this package
+			// This is a less expensive operation that the GetPackageLogLevel() request
+			level := myLoggers[name].GetLogLevel()
+			assert.Equal(t, level, expectedLevel)
+			// Check the verbosity level
+			for _, level := range levels {
+				toDisplay := myLoggers[name].V(level)
+				if level < expectedLevel {
+					assert.False(t, toDisplay)
+				} else {
+					assert.True(t, toDisplay)
+				}
+			}
 		}
 	}
 	//Test set all package level
@@ -100,6 +113,17 @@
 			l, err := GetPackageLogLevel(name)
 			assert.Nil(t, err)
 			assert.Equal(t, l, expectedLevel)
+			level := myLoggers[name].GetLogLevel()
+			assert.Equal(t, level, expectedLevel)
+			// Check the verbosity level
+			for _, level := range levels {
+				toDisplay := myLoggers[name].V(level)
+				if level < expectedLevel {
+					assert.False(t, toDisplay)
+				} else {
+					assert.True(t, toDisplay)
+				}
+			}
 		}
 	}
 }