mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-23 15:14:32 +00:00
This change
- Removes interface `log.Format`,
- Removes method `log.FormatFunc`,
- unexports `TerminalHandler.TerminalFormat` formatting methods (renamed to `TerminalHandler.format`)
- removes the notion of `log.Lazy` values
The lazy handler was useful in the old log package, since it
could defer the evaluation of costly attributes until later in the
log pipeline: thus, if the logging was done at 'Trace', we could
skip evaluation if logging only was set to 'Info'.
With the move to slog, this way of deferring evaluation is no longer
needed, since slog introduced 'Enabled': the caller can thus do
the evaluate-or-not decision at the callsite, which is much more
straight-forward than dealing with lazy reflect-based evaluation.
Also, lazy evaluation would not work with 'native' slog, as in, these
two statements would be evaluated differently:
```golang
log.Info("foo", "my lazy", lazyObj)
slog.Info("foo", "my lazy", lazyObj)
```
122 lines
2.9 KiB
Go
122 lines
2.9 KiB
Go
package log
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"sync/atomic"
|
|
|
|
"golang.org/x/exp/slog"
|
|
)
|
|
|
|
var root atomic.Value
|
|
|
|
func init() {
|
|
defaultLogger := &logger{slog.New(DiscardHandler())}
|
|
SetDefault(defaultLogger)
|
|
}
|
|
|
|
// SetDefault sets the default global logger
|
|
func SetDefault(l Logger) {
|
|
root.Store(l)
|
|
if lg, ok := l.(*logger); ok {
|
|
slog.SetDefault(lg.inner)
|
|
}
|
|
}
|
|
|
|
// Root returns the root logger
|
|
func Root() Logger {
|
|
return root.Load().(Logger)
|
|
}
|
|
|
|
// The following functions bypass the exported logger methods (logger.Debug,
|
|
// 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
|
|
//
|
|
// Log a message at the trace level with context key/value pairs
|
|
//
|
|
// # Usage
|
|
//
|
|
// log.Trace("msg")
|
|
// log.Trace("msg", "key1", val1)
|
|
// log.Trace("msg", "key1", val1, "key2", val2)
|
|
func Trace(msg string, ctx ...interface{}) {
|
|
Root().Write(LevelTrace, msg, ctx...)
|
|
}
|
|
|
|
// Debug is a convenient alias for Root().Debug
|
|
//
|
|
// Log a message at the debug level with context key/value pairs
|
|
//
|
|
// # Usage Examples
|
|
//
|
|
// log.Debug("msg")
|
|
// log.Debug("msg", "key1", val1)
|
|
// log.Debug("msg", "key1", val1, "key2", val2)
|
|
func Debug(msg string, ctx ...interface{}) {
|
|
Root().Write(slog.LevelDebug, msg, ctx...)
|
|
}
|
|
|
|
// Info is a convenient alias for Root().Info
|
|
//
|
|
// Log a message at the info level with context key/value pairs
|
|
//
|
|
// # Usage Examples
|
|
//
|
|
// log.Info("msg")
|
|
// log.Info("msg", "key1", val1)
|
|
// log.Info("msg", "key1", val1, "key2", val2)
|
|
func Info(msg string, ctx ...interface{}) {
|
|
Root().Write(slog.LevelInfo, msg, ctx...)
|
|
}
|
|
|
|
// Warn is a convenient alias for Root().Warn
|
|
//
|
|
// Log a message at the warn level with context key/value pairs
|
|
//
|
|
// # Usage Examples
|
|
//
|
|
// log.Warn("msg")
|
|
// log.Warn("msg", "key1", val1)
|
|
// log.Warn("msg", "key1", val1, "key2", val2)
|
|
func Warn(msg string, ctx ...interface{}) {
|
|
Root().Write(slog.LevelWarn, msg, ctx...)
|
|
}
|
|
|
|
// Error is a convenient alias for Root().Error
|
|
//
|
|
// Log a message at the error level with context key/value pairs
|
|
//
|
|
// # Usage Examples
|
|
//
|
|
// log.Error("msg")
|
|
// log.Error("msg", "key1", val1)
|
|
// log.Error("msg", "key1", val1, "key2", val2)
|
|
func Error(msg string, ctx ...interface{}) {
|
|
Root().Write(slog.LevelError, msg, ctx...)
|
|
}
|
|
|
|
// Crit is a convenient alias for Root().Crit
|
|
//
|
|
// Log a message at the crit level with context key/value pairs, and then exit.
|
|
//
|
|
// # Usage Examples
|
|
//
|
|
// log.Crit("msg")
|
|
// log.Crit("msg", "key1", val1)
|
|
// log.Crit("msg", "key1", val1, "key2", val2)
|
|
func Crit(msg string, ctx ...interface{}) {
|
|
Root().Write(LevelCrit, msg, ctx...)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// New returns a new logger with the given context.
|
|
// New is a convenient alias for Root().New
|
|
func New(ctx ...interface{}) Logger {
|
|
return Root().With(ctx...)
|
|
}
|
|
|
|
func Enabled(level slog.Level) bool {
|
|
return Root().Enabled(context.Background(), level)
|
|
}
|