Skip to content

Get the log level in LogObjectMarshaler #708

Open
@0xjac

Description

@0xjac

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:

  1. 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.

  2. 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
  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:

    func LevelFromEvent(e *Event) Level

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions