本文次要钻研一下zerolog的Level

Level

github.com/rs/zerolog@v1.20.0/log.go

// Level defines log levels.type Level int8const (    // DebugLevel defines debug log level.    DebugLevel Level = iota    // InfoLevel defines info log level.    InfoLevel    // WarnLevel defines warn log level.    WarnLevel    // ErrorLevel defines error log level.    ErrorLevel    // FatalLevel defines fatal log level.    FatalLevel    // PanicLevel defines panic log level.    PanicLevel    // NoLevel defines an absent log level.    NoLevel    // Disabled disables the logger.    Disabled    // TraceLevel defines trace log level.    TraceLevel Level = -1)func (l Level) String() string {    switch l {    case TraceLevel:        return "trace"    case DebugLevel:        return "debug"    case InfoLevel:        return "info"    case WarnLevel:        return "warn"    case ErrorLevel:        return "error"    case FatalLevel:        return "fatal"    case PanicLevel:        return "panic"    case NoLevel:        return ""    }    return ""}
Level为int8类型,其中trace最小为-1,之后是debug、info、warn、error、fatal、panic、NoLevel及Disabled

log.Level

github.com/rs/zerolog@v1.20.0/log.go

func Trace() *zerolog.Event {    return Logger.Trace()}func Debug() *zerolog.Event {    return Logger.Debug()}func Info() *zerolog.Event {    return Logger.Info()}func Warn() *zerolog.Event {    return Logger.Warn()}func Error() *zerolog.Event {    return Logger.Error()}func Fatal() *zerolog.Event {    return Logger.Fatal()}func Panic() *zerolog.Event {    return Logger.Panic()}
log.go提供了Trace、Debug、Info、Warn、Error、Fatal、Panic办法来创立*zerolog.Event

logger.newEvent

github.com/rs/zerolog@v1.20.0/log.go

func (l *Logger) Trace() *Event {    return l.newEvent(TraceLevel, nil)}func (l *Logger) Debug() *Event {    return l.newEvent(DebugLevel, nil)}func (l *Logger) Warn() *Event {    return l.newEvent(WarnLevel, nil)}func (l *Logger) Error() *Event {    return l.newEvent(ErrorLevel, nil)}func (l *Logger) Fatal() *Event {    return l.newEvent(FatalLevel, func(msg string) { os.Exit(1) })}func (l *Logger) Panic() *Event {    return l.newEvent(PanicLevel, func(msg string) { panic(msg) })}func (l *Logger) newEvent(level Level, done func(string)) *Event {    enabled := l.should(level)    if !enabled {        return nil    }    e := newEvent(l.w, level)    e.done = done    e.ch = l.hooks    if level != NoLevel {        e.Str(LevelFieldName, LevelFieldMarshalFunc(level))    }    if l.context != nil && len(l.context) > 1 {        e.buf = enc.AppendObjectData(e.buf, l.context)    }    return e}
newEvent办法首先判断以后logger是否容许指定的level,不容许则间接返回nil;容许的话则通过event包的newEvent来新建event,设置done、hooks

event.newEvent

github.com/rs/zerolog@v1.20.0/event.go

func newEvent(w LevelWriter, level Level) *Event {    e := eventPool.Get().(*Event)    e.buf = e.buf[:0]    e.ch = nil    e.buf = enc.AppendBeginMarker(e.buf)    e.w = w    e.level = level    e.stack = false    return e}
newEvent办法从eventPool获取一个Event,而后重置一下其属性

WithLevel

github.com/rs/zerolog@v1.20.0/log/log.go

func WithLevel(level zerolog.Level) *zerolog.Event {    return Logger.WithLevel(level)}func (l *Logger) WithLevel(level Level) *Event {    switch level {    case TraceLevel:        return l.Trace()    case DebugLevel:        return l.Debug()    case InfoLevel:        return l.Info()    case WarnLevel:        return l.Warn()    case ErrorLevel:        return l.Error()    case FatalLevel:        return l.newEvent(FatalLevel, nil)    case PanicLevel:        return l.newEvent(PanicLevel, nil)    case NoLevel:        return l.Log()    case Disabled:        return nil    default:        panic("zerolog: WithLevel(): invalid level: " + strconv.Itoa(int(level)))    }}
WithLevel能够动静传入Level,而后返回指定level的event

SetGlobalLevel

github.com/rs/zerolog@v1.20.0/ctx.go

func init() {    SetGlobalLevel(TraceLevel)    l := Nop()    disabledLogger = &l}
默认是TraceLevel

实例

func withLevelDemo() {    log.WithLevel(zerolog.TraceLevel).Msg("trace level")    log.WithLevel(zerolog.DebugLevel).Msg("debug level")    log.WithLevel(zerolog.InfoLevel).Msg("info level")}

输入

{"level":"trace","time":"2021-01-03T20:59:42+08:00","message":"trace level"}{"level":"debug","time":"2021-01-03T20:59:42+08:00","message":"debug level"}{"level":"info","time":"2021-01-03T20:59:42+08:00","message":"info level"}

小结

Level为int8类型,其中trace最小为-1,之后是debug、info、warn、error、fatal、panic、NoLevel及Disabled;log.go提供了Trace、Debug、Info、Warn、Error、Fatal、Panic办法来创立*zerolog.Event;WithLevel能够动静传入Level,而后返回指定level的event。

doc

  • zerolog