Use Velo’s strongly-typed fields API to achieve zero-allocation logging in performance-critical code
Velo’s typed fields API eliminates the interface boxing overhead of loosely-typed key-value pairs, enabling true zero-allocation logging on the hot path.
For complex objects, implement ObjectMarshaler to control serialization:
type User struct { ID int Name string}func (u User) MarshalLogObject(enc velo.ObjectEncoder) error { enc.AddInt("id", u.ID) enc.AddString("name", u.Name) return nil}// Use with Object fieldlogger.InfoFields("user created", velo.Object("user", user),)
For arrays, implement ArrayMarshaler:
type Users []Userfunc (u Users) MarshalLogArray(enc velo.ArrayEncoder) error { for _, user := range u { enc.AppendObject(user) } return nil}// Use with Array fieldlogger.InfoFields("batch created", velo.Array("users", users),)
You can freely mix typed and loosely-typed fields, though this negates some performance benefits:
// Works but not optimallogger.Info("mixed example", "key1", value1, "key2", value2)// Better: use LogFields or typed fields consistentlylogger.LogFields(velo.InfoLevel, "typed example", velo.String("key1", value1), velo.String("key2", value2),)