revendor with lgr 0.2

This commit is contained in:
Umputun
2019-01-11 22:51:43 -06:00
parent 8b0926a338
commit cfe8391da5
4 changed files with 81 additions and 26 deletions
+3 -3
View File
@@ -126,12 +126,12 @@
version = "v0.3.1"
[[projects]]
digest = "1:01f2a0dea4785957fb0832580a244e693c710130e2785e4a2f73cc7872cdfa82"
digest = "1:479ca4406d1521b92615374d807581ccfdb1b971abc3bac7e29c1fc83c988745"
name = "github.com/go-pkgz/lgr"
packages = ["."]
pruneopts = "UT"
revision = "5bea4c7108c41005f69ad77c05f516b2228837e2"
version = "v0.1.3"
revision = "07dcefe903e40f6c93674e1b85f84764552665b0"
version = "v0.2.0"
[[projects]]
digest = "1:1212e114344a5cdcc834ea69e19d456eef230f9784659080fee67e02ba2cb574"
+3 -1
View File
@@ -62,8 +62,10 @@ func main() {
func setupLog(dbg bool) {
if dbg {
log.Setup(log.Debug, log.Caller)
log.Setup(log.Debug, log.CallerFile, log.Msec, log.LevelBraces)
return
}
log.Setup(log.Msec, log.LevelBraces)
}
// getDump reads runtime stack and returns as a string
+10 -1
View File
@@ -1,6 +1,9 @@
package lgr
import stdlog "log"
import (
stdlog "log"
"os"
)
var def = New() // default logger doesn't allow DEBUG and doesn't add caller info
@@ -31,6 +34,12 @@ func Print(line string) {
def.Logf(line)
}
// Fatalf simplifies replacement of std logger
func Fatalf(format string, args ...interface{}) {
def.Logf(format, args...)
os.Exit(1)
}
// Setup default logger with options
func Setup(opts ...Option) {
def = New(opts...)
+65 -21
View File
@@ -14,13 +14,15 @@ var levels = []string{"DEBUG", "INFO", "WARN", "ERROR", "PANIC", "FATAL"}
// Logger provided simple logger with basic support of levels. Thread safe
type Logger struct {
stdout, stderr io.Writer
dbg bool
lock sync.Mutex
callers bool
now nowFn
fatal panicFn
skipCallers int
stdout, stderr io.Writer
dbg bool
lock sync.Mutex
callerFile, callerFunc bool
now nowFn
fatal panicFn
skipCallers int
levelBraces bool
msec bool
}
type nowFn func() time.Time
@@ -48,24 +50,43 @@ func New(options ...Option) *Logger {
// FATAL adds runtime stack and os.exit(1), like panic.
func (l *Logger) Logf(format string, args ...interface{}) {
// format timestamp with or without msecs
ts := func() (res string) {
if l.msec {
return l.now().Format("2006/01/02 15:04:05.000 ")
}
return l.now().Format("2006/01/02 15:04:05 ")
}
lv, msg := l.extractLevel(fmt.Sprintf(format, args...))
if lv == "DEBUG " && !l.dbg {
return
}
var bld strings.Builder
bld.WriteString(l.now().Format("2006/01/02 15:04:05.000 "))
bld.WriteString(ts())
bld.WriteString(lv)
if l.dbg && l.callers {
if l.dbg && (l.callerFile || l.callerFunc) {
if pc, file, line, ok := runtime.Caller(l.skipCallers); ok {
fnameElems := strings.Split(file, "/")
funcNameElems := strings.Split(runtime.FuncForPC(pc).Name(), "/")
srcFileInfo := fmt.Sprintf("{%s:%d %s} ", strings.Join(fnameElems[len(fnameElems)-2:], "/"),
line, funcNameElems[len(funcNameElems)-1])
funcName := ""
if l.callerFunc {
funcNameElems := strings.Split(runtime.FuncForPC(pc).Name(), "/")
funcName = funcNameElems[len(funcNameElems)-1]
}
fileInfo := ""
if l.callerFile {
fnameElems := strings.Split(file, "/")
fileInfo = fmt.Sprintf("%s:%d", strings.Join(fnameElems[len(fnameElems)-2:], "/"), line)
if l.callerFunc {
fileInfo += " "
}
}
srcFileInfo := fmt.Sprintf("{%s%s} ", fileInfo, funcName)
bld.WriteString(srcFileInfo)
}
}
if lv == "DEBUG " && !l.dbg {
return
}
bld.WriteString(msg) //nolint
bld.WriteString("\n") //nolint
@@ -86,19 +107,27 @@ func (l *Logger) Logf(format string, args ...interface{}) {
}
func (l *Logger) extractLevel(line string) (level, msg string) {
brace := func(b string) string {
if l.levelBraces {
return b
}
return ""
}
spaces := " "
for _, lv := range levels {
if strings.HasPrefix(line, lv) {
if len(lv) == 4 {
spaces = " "
}
return lv + spaces, line[len(lv)+1:]
return brace("[") + lv + brace("]") + spaces, line[len(lv)+1:]
}
if strings.HasPrefix(line, "["+lv+"]") {
if len(lv) == 4 {
spaces = " "
}
return lv + spaces, line[len(lv)+3:]
return brace("[") + lv + brace("]") + spaces, line[len(lv)+3:]
}
}
return "", line
@@ -137,7 +166,22 @@ func Debug(l *Logger) {
l.dbg = true
}
// Caller adds caller info with func, file, and line number
func Caller(l *Logger) {
l.callers = true
// CallerFile adds caller info with file, and line number
func CallerFile(l *Logger) {
l.callerFile = true
}
// CallerFunc adds caller info with function name
func CallerFunc(l *Logger) {
l.callerFunc = true
}
// LevelBraces adds [] to level
func LevelBraces(l *Logger) {
l.levelBraces = true
}
// Msec adds .msec to timestamp
func Msec(l *Logger) {
l.msec = true
}