You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用zerolog自动记录Go语言中的结构体?

在zerolog中自动记录Go结构体的几种方法

你不需要手动用zerolog.Dict()逐个添加结构体字段,zerolog提供了更便捷的方式来处理结构体日志:

方法1:使用Interface()快速序列化(推荐)

直接利用结构体的json标签,通过Interface()方法将结构体作为字段值传入,zerolog会自动完成序列化:

msg := Message{
    AWS_REGION: "us-east-1",
    LOG_LEVEL:  "info",
    STAGE:      "production",
    REQUEST_ID: "abc123",
}

log.Info().
    Str("foo", "bar").
    Interface("message", msg). // 直接传入结构体实例
    Msg("hello world")

输出结果会自动将message字段序列化为嵌套的JSON对象:

{"level":"info","time":1699999999,"foo":"bar","message":{"region":"us-east-1","level":"info","stage":"production","requestId":"abc123"},"message":"hello world"}

方法2:实现LogObjectMarshaler接口(自定义序列化逻辑)

如果需要更精细地控制结构体的日志输出(比如忽略某些字段、修改字段值格式),可以让结构体实现zerolog.LogObjectMarshaler接口:

import "github.com/rs/zerolog"

type Message struct {
    AWS_REGION     string `json:"region"`
    LOG_LEVEL      string `json:"level"`
    STAGE          string `json:"stage"`
    REQUEST_ID     string `json:"requestId"`
}

// 实现LogObjectMarshaler接口
func (m Message) MarshalZerologObject(e *zerolog.Event) {
    // 自定义字段输出逻辑,可修改字段名或添加额外处理
    e.Str("region", m.AWS_REGION).
       Str("log_level", m.LOG_LEVEL).
       Str("stage", m.STAGE).
       Str("request_id", m.REQUEST_ID)
}

// 调用时使用Object()方法
log.Info().
    Str("foo", "bar").
    Object("message", msg).
    Msg("hello world")

这种方式的优势是可以完全控制每个字段的输出行为,适合有定制化需求的场景。

注意事项

  • 不能直接将结构体传入zerolog.Dict(),因为Dict()的参数需要是*zerolog.Event类型(通过zerolog.Dict()构建的事件),上面两种方法是zerolog官方推荐的结构体日志方案。
  • 如果结构体中有未导出字段(小写开头),无论是Interface()还是Object()都不会输出这些字段,这和Go的JSON序列化规则一致。

内容的提问来源于stack exchange,提问作者Joey Yi Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:00:54