This commit consists of:
1) Fixing the core tests
2) Fix an error in the logger where the runtime stack trace behaved
differently in go 1.10 vs go 1.9.
3) Minor other fixes
Change-Id: I1263df38ffcd733174f776a0901583cfb59c616e
diff --git a/common/log/log.go b/common/log/log.go
index e86ba0d..7f43e87 100644
--- a/common/log/log.go
+++ b/common/log/log.go
@@ -149,26 +149,6 @@
return defaultLogger, nil
}
-func SetPackageLevelLoggers(outputType string, level int, defaultFields Fields, pkgNames []string) error {
- cfgs = make(map[string]zp.Config)
- loggers = make(map[string]*logger)
- for _, pkg := range pkgNames {
- // Build a custom config using zap - for now initialzie all packages uses the same config
- cfgs[pkg] = getDefaultConfig(outputType, level, defaultFields)
-
- l, err := cfgs[pkg].Build()
- if err != nil {
- return err
- }
-
- loggers[pkg] = &logger{
- log: l.Sugar(),
- parent: l,
- }
- }
-
- return nil
-}
func AddPackage(outputType string, level int, defaultFields Fields) error {
if cfgs == nil {
@@ -217,24 +197,6 @@
return nil
}
-//func SetDefaultLoglevel(level int) {
-// switch level {
-// case DebugLevel:
-// cfg.Level.SetLevel(zc.DebugLevel)
-// case InfoLevel:
-// cfg.Level.SetLevel(zc.InfoLevel)
-// case WarnLevel:
-// cfg.Level.SetLevel(zc.WarnLevel)
-// case ErrorLevel:
-// cfg.Level.SetLevel(zc.ErrorLevel)
-// case PanicLevel:
-// cfg.Level.SetLevel(zc.PanicLevel)
-// case FatalLevel:
-// cfg.Level.SetLevel(zc.FatalLevel)
-// default:
-// cfg.Level.SetLevel(zc.ErrorLevel)
-// }
-//}
func SetPackageLogLevel(packageName string, level int) {
// Get proper config
@@ -258,6 +220,28 @@
}
}
+func SetAllLogLevel(level int) {
+ // Get proper config
+ for _, cfg := range cfgs{
+ switch level {
+ case DebugLevel:
+ cfg.Level.SetLevel(zc.DebugLevel)
+ case InfoLevel:
+ cfg.Level.SetLevel(zc.InfoLevel)
+ case WarnLevel:
+ cfg.Level.SetLevel(zc.WarnLevel)
+ case ErrorLevel:
+ cfg.Level.SetLevel(zc.ErrorLevel)
+ case PanicLevel:
+ cfg.Level.SetLevel(zc.PanicLevel)
+ case FatalLevel:
+ cfg.Level.SetLevel(zc.FatalLevel)
+ default:
+ cfg.Level.SetLevel(zc.ErrorLevel)
+ }
+ }
+}
+
// CleanUp flushed any buffered log entries. Applications should take care to call
// CleanUp before exiting.
func CleanUp() error {
@@ -280,82 +264,55 @@
return nil
}
-// GetLogger returned the default logger. If SetLogger was not previously invoked then
-// this method will return an error
-//func GetLogger() (Logger, error) {
-// if defaultLogger == nil {
-// // Setup the logger with default values - debug level,
-// SetDefaultLogger(JSON, 0, Fields{"instanceId": "default-logger"})
-// //return nil, errors.New("Uninitialized-logger")
-// }
-// return defaultLogger, nil
-//}
-
-//func extractFileNameAndLineNumber(skipLevel int) (string, int) {
-// _, file, line, ok := runtime.Caller(skipLevel)
-// var key string
-// if !ok {
-// key = "<???>"
-// line = 1
-// } else {
-// slash := strings.LastIndex(file, "/")
-// key = file[slash+1:]
-// }
-// return key, line
-//}
-
-// sourced adds a source field to the logger that contains
-// the file name and line where the logging happened.
-//func (l *logger) sourced() *zp.SugaredLogger {
-// key, line := extractFileNameAndLineNumber(3)
-// if strings.HasSuffix(key, "log.go") || strings.HasSuffix(key, "proc.go") {
-// // Go to a lower level
-// key, line = extractFileNameAndLineNumber(2)
-// }
-// if !strings.HasSuffix(key, ".go") {
-// // Go to a higher level
-// key, line = extractFileNameAndLineNumber(4)
-// }
-//
-// return l.log.With("caller", fmt.Sprintf("%s:%d", key, line))
-//}
-
-func retrieveCallInfo(skiplevel int) (string, string, string, int) {
- pc, file, line, _ := runtime.Caller(skiplevel)
- _, fileName := path.Split(file)
- parts := strings.Split(runtime.FuncForPC(pc).Name(), ".")
- pl := len(parts)
+func getCallerInfo() (string, string, string, int){
+ // Since the caller of a log function is one stack frame before (in terms of stack higher level) the log.go
+ // filename, then first look for the last log.go filename and then grab the caller info one level higher.
+ maxLevel := 3
+ skiplevel := 3 // Level with the most empirical success to see the last log.go stack frame.
+ pc := make([]uintptr, maxLevel)
+ n := runtime.Callers(skiplevel, pc)
packageName := ""
- funcName := parts[pl-1]
-
- if parts[pl-2][0] == '(' {
- //funcName = parts[pl-2] + "." + funcName
- packageName = strings.Join(parts[0:pl-2], ".")
- } else {
- packageName = strings.Join(parts[0:pl-1], ".")
+ funcName := ""
+ fileName := ""
+ var line int
+ if n == 0 {
+ return packageName, fileName, funcName, line
+ }
+ frames := runtime.CallersFrames(pc[:n])
+ var frame runtime.Frame
+ var foundFrame runtime.Frame
+ more := true
+ for more {
+ frame, more = frames.Next()
+ _, fileName = path.Split(frame.File)
+ if fileName != "log.go" {
+ foundFrame = frame // First frame after log.go in the frame stack
+ break
+ }
+ }
+ parts := strings.Split(foundFrame.Function, ".")
+ pl := len(parts)
+ if pl >= 2 {
+ funcName = parts[pl-1]
+ if parts[pl-2][0] == '(' {
+ packageName = strings.Join(parts[0:pl-2], ".")
+ } else {
+ packageName = strings.Join(parts[0:pl-1], ".")
+ }
}
- return packageName, fileName, funcName, line
-}
-
-func getCallerInfo() (string, string, string, int) {
- packageName, fileName, funcName, line := retrieveCallInfo(3)
-
- if strings.HasSuffix(funcName, "log.go") || strings.HasSuffix(funcName, "proc.go") || strings.HasSuffix(packageName, ".init") {
- // Go to a lower level
- packageName, fileName, funcName, line = retrieveCallInfo(2)
- }
- if !strings.HasSuffix(funcName, ".go") {
- // Go to a higher level
- packageName, fileName, funcName, line = retrieveCallInfo(4)
+ if strings.HasSuffix(packageName, ".init") {
+ packageName= strings.TrimSuffix(packageName, ".init")
}
if strings.HasSuffix(fileName, ".go") {
- fileName = strings.TrimSuffix(fileName, ".go")
+ fileName= strings.TrimSuffix(fileName, ".go")
}
- return packageName, fileName, funcName, line
+
+ return packageName, fileName, funcName, foundFrame.Line
}
+
func getPackageLevelLogger() *zp.SugaredLogger {
pkgName, fileName, funcName, line := getCallerInfo()
if _, exist := loggers[pkgName]; exist {