diff --git a/log/README_ETHEREUM.md b/log/README_ETHEREUM.md index 6a0b0141b1..f6c42ccc03 100644 --- a/log/README_ETHEREUM.md +++ b/log/README_ETHEREUM.md @@ -2,3 +2,4 @@ This package is a fork of https://github.com/inconshreveable/log15, with some minor modifications required by the go-ethereum codebase: * Support for log level `trace` + * Modified behavior to exit on `critical` failure diff --git a/log/format.go b/log/format.go index 376376183c..9dcfc8d13c 100644 --- a/log/format.go +++ b/log/format.go @@ -58,6 +58,8 @@ func TerminalFormat() Format { color = 32 case LvlDebug: color = 36 + case LvlTrace: + color = 34 } b := &bytes.Buffer{} diff --git a/log/logger.go b/log/logger.go index a9d42b8da2..a7f7d9df7f 100644 --- a/log/logger.go +++ b/log/logger.go @@ -2,6 +2,7 @@ package log import ( "fmt" + "os" "time" "github.com/go-stack/stack" @@ -20,11 +21,14 @@ const ( LvlWarn LvlInfo LvlDebug + LvlTrace ) // Returns the name of a Lvl func (l Lvl) String() string { switch l { + case LvlTrace: + return "trce" case LvlDebug: return "dbug" case LvlInfo: @@ -44,6 +48,8 @@ func (l Lvl) String() string { // Useful for parsing command line args and configuration files. func LvlFromString(lvlString string) (Lvl, error) { switch lvlString { + case "trace", "trce": + return LvlTrace, nil case "debug", "dbug": return LvlDebug, nil case "info": @@ -87,6 +93,7 @@ type Logger interface { SetHandler(h Handler) // Log a message at the given level with context key/value pairs + Trace(msg string, ctx ...interface{}) Debug(msg string, ctx ...interface{}) Info(msg string, ctx ...interface{}) Warn(msg string, ctx ...interface{}) @@ -128,6 +135,10 @@ func newContext(prefix []interface{}, suffix []interface{}) []interface{} { return newCtx } +func (l *logger) Trace(msg string, ctx ...interface{}) { + l.write(msg, LvlTrace, ctx) +} + func (l *logger) Debug(msg string, ctx ...interface{}) { l.write(msg, LvlDebug, ctx) } @@ -146,6 +157,7 @@ func (l *logger) Error(msg string, ctx ...interface{}) { func (l *logger) Crit(msg string, ctx ...interface{}) { l.write(msg, LvlCrit, ctx) + os.Exit(1) } func (l *logger) GetHandler() Handler { diff --git a/log/root.go b/log/root.go index 39b4c94294..6814cc2736 100644 --- a/log/root.go +++ b/log/root.go @@ -41,6 +41,11 @@ func Root() Logger { // etc.) to keep the call depth the same for all paths to logger.write so // runtime.Caller(2) always refers to the call site in client code. +// Trace is a convenient alias for Root().Trace +func Trace(msg string, ctx ...interface{}) { + root.write(msg, LvlTrace, ctx) +} + // Debug is a convenient alias for Root().Debug func Debug(msg string, ctx ...interface{}) { root.write(msg, LvlDebug, ctx) @@ -64,4 +69,5 @@ func Error(msg string, ctx ...interface{}) { // Crit is a convenient alias for Root().Crit func Crit(msg string, ctx ...interface{}) { root.write(msg, LvlCrit, ctx) + os.Exit(1) } diff --git a/log/syslog.go b/log/syslog.go index 4f1097ff92..71a17b30b3 100644 --- a/log/syslog.go +++ b/log/syslog.go @@ -38,6 +38,8 @@ func sharedSyslog(fmtr Format, sysWr *syslog.Writer, err error) (Handler, error) syslogFn = sysWr.Info case LvlDebug: syslogFn = sysWr.Debug + case LvlTrace: + syslogFn = func(m string) error { return nil } // There's no syslog level for trace } s := strings.TrimSpace(string(fmtr.Format(r)))