forked from jshiffer/matterbridge
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package logr
|
|
|
|
import (
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
const (
|
|
maximumStackDepth int = 30
|
|
)
|
|
|
|
var (
|
|
logrPkg string
|
|
pkgCalcOnce sync.Once
|
|
)
|
|
|
|
// GetPackageName returns the root package name of Logr.
|
|
func GetLogrPackageName() string {
|
|
pkgCalcOnce.Do(func() {
|
|
logrPkg = GetPackageName("GetLogrPackageName")
|
|
})
|
|
return logrPkg
|
|
}
|
|
|
|
// GetPackageName returns the package name of the caller.
|
|
// `callingFuncName` should be the name of the calling function and
|
|
// should be unique enough not to collide with any runtime methods.
|
|
func GetPackageName(callingFuncName string) string {
|
|
var pkgName string
|
|
|
|
pcs := make([]uintptr, maximumStackDepth)
|
|
_ = runtime.Callers(0, pcs)
|
|
|
|
for _, pc := range pcs {
|
|
funcName := runtime.FuncForPC(pc).Name()
|
|
if strings.Contains(funcName, callingFuncName) {
|
|
pkgName = ResolvePackageName(funcName)
|
|
break
|
|
}
|
|
}
|
|
return pkgName
|
|
}
|
|
|
|
// ResolvePackageName reduces a fully qualified function name to the package name
|
|
func ResolvePackageName(f string) string {
|
|
for {
|
|
lastPeriod := strings.LastIndex(f, ".")
|
|
lastSlash := strings.LastIndex(f, "/")
|
|
if lastPeriod > lastSlash {
|
|
f = f[:lastPeriod]
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
return f
|
|
}
|