首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊zerolog的Hook

聊聊zerolog的Hook

作者头像
code4it
发布2021-01-12 11:09:26
发布2021-01-12 11:09:26
50700
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下zerolog的Hook

Hook

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

代码语言:javascript
代码运行次数:0
运行
复制
// Hook defines an interface to a log hook.
type Hook interface {
    // Run runs the hook with the event.
    Run(e *Event, level Level, message string)
}

Hook接口定义了Run方法,它接收event、level、message参数

LevelHook

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

代码语言:javascript
代码运行次数:0
运行
复制
// LevelHook applies a different hook for each level.
type LevelHook struct {
    NoLevelHook, TraceHook, DebugHook, InfoHook, WarnHook, ErrorHook, FatalHook, PanicHook Hook
}

// Run implements the Hook interface.
func (h LevelHook) Run(e *Event, level Level, message string) {
    switch level {
    case TraceLevel:
        if h.TraceHook != nil {
            h.TraceHook.Run(e, level, message)
        }
    case DebugLevel:
        if h.DebugHook != nil {
            h.DebugHook.Run(e, level, message)
        }
    case InfoLevel:
        if h.InfoHook != nil {
            h.InfoHook.Run(e, level, message)
        }
    case WarnLevel:
        if h.WarnHook != nil {
            h.WarnHook.Run(e, level, message)
        }
    case ErrorLevel:
        if h.ErrorHook != nil {
            h.ErrorHook.Run(e, level, message)
        }
    case FatalLevel:
        if h.FatalHook != nil {
            h.FatalHook.Run(e, level, message)
        }
    case PanicLevel:
        if h.PanicHook != nil {
            h.PanicHook.Run(e, level, message)
        }
    case NoLevel:
        if h.NoLevelHook != nil {
            h.NoLevelHook.Run(e, level, message)
        }
    }
}

// NewLevelHook returns a new LevelHook.
func NewLevelHook() LevelHook {
    return LevelHook{}
}

LevelHook定义了各种level的hook,其Run方法根据指定的level执行指定的hook

HookFunc

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

代码语言:javascript
代码运行次数:0
运行
复制
// HookFunc is an adaptor to allow the use of an ordinary function
// as a Hook.
type HookFunc func(e *Event, level Level, message string)

// Run implements the Hook interface.
func (h HookFunc) Run(e *Event, level Level, message string) {
    h(e, level, message)
}

HookFunc是个func类型,它实现了Hook接口的Run方法

log.Hook

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

代码语言:javascript
代码运行次数:0
运行
复制
type Logger struct {
    w       LevelWriter
    level   Level
    sampler Sampler
    context []byte
    hooks   []Hook
}

// Hook returns a logger with the h Hook.
func (l Logger) Hook(h Hook) Logger {
    l.hooks = append(l.hooks, h)
    return l
}

log.Hook方法用于注册hook

log.newEvent

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

代码语言:javascript
代码运行次数:0
运行
复制
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
}

log.newEvent方法在创建event的时候会把自己的hooks拷贝给event

msg

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

代码语言:javascript
代码运行次数:0
运行
复制
func (e *Event) msg(msg string) {
    for _, hook := range e.ch {
        hook.Run(e, e.level, msg)
    }
    if msg != "" {
        e.buf = enc.AppendString(enc.AppendKey(e.buf, MessageFieldName), msg)
    }
    if e.done != nil {
        defer e.done(msg)
    }
    if err := e.write(); err != nil {
        if ErrorHandler != nil {
            ErrorHandler(err)
        } else {
            fmt.Fprintf(os.Stderr, "zerolog: could not write event: %v\n", err)
        }
    }
}

event的msg方法会遍历event的hooks,然后挨个执行Hook的Run方法

实例

代码语言:javascript
代码运行次数:0
运行
复制
type SeverityHook struct{}

func (h SeverityHook) Run(e *zerolog.Event, level zerolog.Level, msg string) {
    if level != zerolog.NoLevel {
        e.Str("abc", "form hook")
    }
}

func hookDemo() {
    hooked := log.Hook(SeverityHook{})
    hooked.Warn().Msg("hello")
}

输出

代码语言:javascript
代码运行次数:0
运行
复制
{"level":"warn","time":"2021-01-07T23:07:13+08:00","abc":"form hook","message":"hello"}

小结

zerolog提供了Hook接口,用于修改event;log.Hook方法用于注册hook;log.newEvent方法在创建event的时候会把自己的hooks拷贝给event;event的msg方法会遍历event的hooks,然后挨个执行Hook的Run方法。

doc

  • zerolog
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hook
  • LevelHook
  • HookFunc
  • log.Hook
  • log.newEvent
  • msg
  • 实例
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档