Description
I have a custom type (struct
) which implements LogObjectMarshaler
. I would like to add extra field when logging my object but only at the debug
level. However I can't get the level associated with the event passed to MarshalZerologObject(e *zerolog.Event)
.
Here is an example of what I am trying to do (modified from the doc) where on debug, I also log the user's age:
type User struct {
Name string
Age int
Created time.Time
}
func (u User) MarshalZerologObject(e *zerolog.Event) {
e.Str("name", u.Name).Time("created", u.Created)
if e.level == zerolog.DebugLevel { // Doesn't really work since level is private.
e.Int("age", u.Age)
}
}
I'm open to any solution to get the level, some proposals:
-
Modify
LogObjectMarshaler
to pass the event similar to hooks:type LogObjectMarshaler interface { MarshalZerologObject(e *Event, level Level) }
However, this would be a breaking change for a v2.
-
Similarly, to the above but in a backwards compatible way, provide a new interface:
type LogObjectLevelMarshaler interface { MarshalLevelZerologObject(e *Event, level Level) }
However, this would also require new methods on the event to use this new marshaler:
func (e *Event) LevelObject(key string, obj LogObjectLevelMarshaler) *Event` func (e *Event) LevelEmbedObject(obj LogObjectLevelMarshaler) *Event
-
Add a getter on the event to retrieve the level.
-
Provide a standalone function which acts as a getter (to avoid polluting the API of the event), something like:
func LevelFromEvent(e *Event) Level