#708·zerolog

Get the log level in LogObjectMarshaler

Author: 0xjacCreated Jan 21, 2025Updated Jan 10, 2026

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:

go
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:

  1. Modify LogObjectMarshaler to pass the event similar to hooks:

    go
    type LogObjectMarshaler interface {
        MarshalZerologObject(e *Event, level Level)
    }

    However, this would be a breaking change for a v2.

  2. Similarly, to the above but in a backwards compatible way, provide a new interface:

    go
    type LogObjectLevelMarshaler interface {
        MarshalLevelZerologObject(e *Event, level Level)
    }

    However, this would also require new methods on the event to use this new marshaler:

    go
    func (e *Event) LevelObject(key string, obj LogObjectLevelMarshaler) *Event`
    func (e *Event) LevelEmbedObject(obj LogObjectLevelMarshaler) *Event
  3. Add a getter on the event to retrieve the level.

  4. Provide a standalone function which acts as a getter (to avoid polluting the API of the event), something like:

    go
    func LevelFromEvent(e *Event) Level