3

聊聊zerolog的Formatter

 3 years ago
source link: https://studygolang.com/articles/32491
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文主要研究一下zerolog的Formatter

Formatter

github.com/rs/[email protected]/console.go

// Formatter transforms the input into a formatted string.
type Formatter func(interface{}) string

Formatter接口定义了一个func用于将interface{}转换为string

ConsoleWriter

github.com/rs/[email protected]/console.go

type ConsoleWriter struct {
    // Out is the output destination.
    Out io.Writer

    // NoColor disables the colorized output.
    NoColor bool

    // TimeFormat specifies the format for timestamp in output.
    TimeFormat string

    // PartsOrder defines the order of parts in output.
    PartsOrder []string

    FormatTimestamp     Formatter
    FormatLevel         Formatter
    FormatCaller        Formatter
    FormatMessage       Formatter
    FormatFieldName     Formatter
    FormatFieldValue    Formatter
    FormatErrFieldName  Formatter
    FormatErrFieldValue Formatter
}

ConsoleWriter定义了TimeFormat、FormatTimestamp、FormatLevel、FormatCaller、FormatMessage、FormatFieldName、FormatFieldValue、FormatErrFieldName、FormatErrFieldValue属性

writePart

github.com/rs/[email protected]/console.go

// writePart appends a formatted part to buf.
func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, p string) {
    var f Formatter

    switch p {
    case LevelFieldName:
        if w.FormatLevel == nil {
            f = consoleDefaultFormatLevel(w.NoColor)
        } else {
            f = w.FormatLevel
        }
    case TimestampFieldName:
        if w.FormatTimestamp == nil {
            f = consoleDefaultFormatTimestamp(w.TimeFormat, w.NoColor)
        } else {
            f = w.FormatTimestamp
        }
    case MessageFieldName:
        if w.FormatMessage == nil {
            f = consoleDefaultFormatMessage
        } else {
            f = w.FormatMessage
        }
    case CallerFieldName:
        if w.FormatCaller == nil {
            f = consoleDefaultFormatCaller(w.NoColor)
        } else {
            f = w.FormatCaller
        }
    default:
        if w.FormatFieldValue == nil {
            f = consoleDefaultFormatFieldValue
        } else {
            f = w.FormatFieldValue
        }
    }

    var s = f(evt[p])

    if len(s) > 0 {
        buf.WriteString(s)
        if p != w.PartsOrder[len(w.PartsOrder)-1] { // Skip space for last part
            buf.WriteByte(' ')
        }
    }
}

writePart方法针对不同的field来取不同的Formatter,然后执行Formatter获取string,最后通过buf.WriteString(s)写入;如果FormatTimestamp没有设置,则取TimeFormat创建Formatter

func formatDemo() {
    output := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}
    output.FormatLevel = func(i interface{}) string {
        return strings.ToUpper(fmt.Sprintf("| %-6s|", i))
    }
    output.FormatMessage = func(i interface{}) string {
        return fmt.Sprintf("***%s****", i)
    }
    output.FormatFieldName = func(i interface{}) string {
        return fmt.Sprintf("%s:", i)
    }
    output.FormatFieldValue = func(i interface{}) string {
        return strings.ToUpper(fmt.Sprintf("%s", i))
    }

    log := zerolog.New(output).With().Timestamp().Logger()
    log.Info().Str("foo", "bar").Msg("Hello World")
}
2021-01-06T23:16:42+08:00 | INFO  | ***Hello World**** foo:BAR

zerolog的ConsoleWriter定义了Formatter用于自定义输出格式,如果FormatTimestamp没有设置,则取TimeFormat创建Formatter。


有疑问加站长微信联系(非本文作者)

280

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK