1

本文主要研究一下zerolog的Level

Level

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

// Level defines log levels.
type Level int8

const (
    // 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


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...