From bd362db87e3e662e658234f35889a05ffdeab2e5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 25 Oct 2019 13:37:58 +0200 Subject: [PATCH] Improve logging --- log/logging.go | 6 +++--- log/output.go | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/log/logging.go b/log/logging.go index f94d12e..2d605c8 100644 --- a/log/logging.go +++ b/log/logging.go @@ -90,7 +90,7 @@ var ( startedSignal = make(chan struct{}) ) -// SetPkgLevels sets individual log levels for packages. +// SetPkgLevels sets individual log levels for packages. Only effective after Start(). func SetPkgLevels(levels map[string]Severity) { pkgLevelsLock.Lock() pkgLevels = levels @@ -103,7 +103,7 @@ func UnSetPkgLevels() { pkgLevelsActive.UnSet() } -// SetLogLevel sets a new log level. +// SetLogLevel sets a new log level. Only effective after Start(). func SetLogLevel(level Severity) { atomic.StoreUint32(logLevel, uint32(level)) } @@ -138,7 +138,7 @@ func Start() (err error) { initialLogLevel := ParseLevel(logLevelFlag) if initialLogLevel > 0 { - atomic.StoreUint32(logLevel, uint32(initialLogLevel)) + SetLogLevel(initialLogLevel) } else { err = fmt.Errorf("log warning: invalid log level \"%s\", falling back to level info", logLevelFlag) fmt.Fprintf(os.Stderr, "%s\n", err.Error()) diff --git a/log/output.go b/log/output.go index cde86c5..28bde37 100644 --- a/log/output.go +++ b/log/output.go @@ -2,6 +2,8 @@ package log import ( "fmt" + "os" + "runtime/debug" "time" ) @@ -39,16 +41,51 @@ func writeLine(line *logLine, duplicates uint64) { } func startWriter() { - shutdownWaitGroup.Add(1) fmt.Println(fmt.Sprintf("%s%s %s BOF%s", InfoLevel.color(), time.Now().Format(timeFormat), rightArrow, endColor())) - go writer() + + shutdownWaitGroup.Add(1) + go writerManager() } -func writer() { +func writerManager() { + defer shutdownWaitGroup.Done() + + for { + err := writer() + if err != nil { + Errorf("log: writer failed: %s", err) + } else { + return + } + } +} + +func writer() (err error) { + defer func() { + // recover from panic + panicVal := recover() + if panicVal != nil { + err = fmt.Errorf("%s", panicVal) + + // write stack to stderr + fmt.Fprintf( + os.Stderr, + `===== Error Report ===== +Message: %s +StackTrace: + +%s +===== End of Report ===== +`, + err, + string(debug.Stack()), + ) + } + }() + var currentLine *logLine var nextLine *logLine var duplicates uint64 - defer shutdownWaitGroup.Done() for { // reset @@ -106,7 +143,9 @@ func writer() { } // write final line - writeLine(currentLine, duplicates) + if currentLine != nil { + writeLine(currentLine, duplicates) + } // reset state currentLine = nil //nolint:ineffassign nextLine = nil