Improve logging

This commit is contained in:
Daniel 2019-10-25 13:37:58 +02:00
parent ed61819be7
commit bd362db87e
2 changed files with 47 additions and 8 deletions

View file

@ -90,7 +90,7 @@ var (
startedSignal = make(chan struct{}) 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) { func SetPkgLevels(levels map[string]Severity) {
pkgLevelsLock.Lock() pkgLevelsLock.Lock()
pkgLevels = levels pkgLevels = levels
@ -103,7 +103,7 @@ func UnSetPkgLevels() {
pkgLevelsActive.UnSet() pkgLevelsActive.UnSet()
} }
// SetLogLevel sets a new log level. // SetLogLevel sets a new log level. Only effective after Start().
func SetLogLevel(level Severity) { func SetLogLevel(level Severity) {
atomic.StoreUint32(logLevel, uint32(level)) atomic.StoreUint32(logLevel, uint32(level))
} }
@ -138,7 +138,7 @@ func Start() (err error) {
initialLogLevel := ParseLevel(logLevelFlag) initialLogLevel := ParseLevel(logLevelFlag)
if initialLogLevel > 0 { if initialLogLevel > 0 {
atomic.StoreUint32(logLevel, uint32(initialLogLevel)) SetLogLevel(initialLogLevel)
} else { } else {
err = fmt.Errorf("log warning: invalid log level \"%s\", falling back to level info", logLevelFlag) err = fmt.Errorf("log warning: invalid log level \"%s\", falling back to level info", logLevelFlag)
fmt.Fprintf(os.Stderr, "%s\n", err.Error()) fmt.Fprintf(os.Stderr, "%s\n", err.Error())

View file

@ -2,6 +2,8 @@ package log
import ( import (
"fmt" "fmt"
"os"
"runtime/debug"
"time" "time"
) )
@ -39,16 +41,51 @@ func writeLine(line *logLine, duplicates uint64) {
} }
func startWriter() { func startWriter() {
shutdownWaitGroup.Add(1)
fmt.Println(fmt.Sprintf("%s%s %s BOF%s", InfoLevel.color(), time.Now().Format(timeFormat), rightArrow, endColor())) 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 currentLine *logLine
var nextLine *logLine var nextLine *logLine
var duplicates uint64 var duplicates uint64
defer shutdownWaitGroup.Done()
for { for {
// reset // reset
@ -106,7 +143,9 @@ func writer() {
} }
// write final line // write final line
writeLine(currentLine, duplicates) if currentLine != nil {
writeLine(currentLine, duplicates)
}
// reset state // reset state
currentLine = nil //nolint:ineffassign currentLine = nil //nolint:ineffassign
nextLine = nil nextLine = nil