如何使用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
相关产品推荐
相关产品推荐

