log15 icon indicating copy to clipboard operation
log15 copied to clipboard

Control amount of padding

Open kevinburke opened this issue 9 years ago • 5 comments
trafficstars

I'm trying to add HTTP logging to my application. The format I want is all keys and values, no Msg component.

The terminal format adds 40 chars of padding, regardless of whether a Msg is specified. It would be nice if you could omit this padding without having to reimplement a lot of the terminal display code.

kevinburke avatar Jun 21 '16 03:06 kevinburke

Yeah, we need a way to make the formatter more customizable. I like the idea of setting up functional options for the LogFmtFormat constructor and letting you pass those in. So the API might look like:

func LogFmtFormat(opts ...FormatOption)

And usage:

// default
fmtr  := log.LogFmtFormat()

// customized formatter
fmtr := log.LogFmtFormat(
    log.WithTimeFormat(func(time.Time) string {
        return "Hammer Time!"
    }),
    log.WithMessagePadding(10),
    log.WithTimelKey("time"),
    log.WithLevelKey(""), // empty string means omit
)

This would address #84 and some other issues we closed in the past.Maybe we could even share some of the options with the JSONFormatter. Thoughts?

@ChrisHines thoughts on this API? I think it would get us some flexibility in custom formatting we were always missing. I wonder if this is a better way to allow folks to define custom names for t, lvl, and msg keys instead of the RecordKeyNames that we eventually settled on

inconshreveable avatar Jun 22 '16 00:06 inconshreveable

@grahamking started down the path of functional options in #60 but abandoned it for a custom formatter the better fit his needs.

The log.WithTimeFormat approach is interesting because it doesn't assume you are using time.Format.

ChrisHines avatar Jun 22 '16 00:06 ChrisHines

interesting. @kevinburke or I might take a stab at resurrecting that approach. do you like the way that worked out for StdlibAdapterOption in go-kit/log?

inconshreveable avatar Jun 22 '16 00:06 inconshreveable

I don't use StdlibAdapter much and I didn't write it either, credit for that idea goes to @peterbourgon, but I do like how functional options work for this sort of thing.

ChrisHines avatar Jun 22 '16 00:06 ChrisHines

Instead of functional style options like above why not pass in an options struct?

In the struct the user can specify only the options they need and rest all is default. I have seen this approach in the Kafka go library

Examples

https://pkg.go.dev/github.com/segmentio/kafka-go?utm_source=godoc#Writer

https://github.com/segmentio/kafka-go/blob/v0.4.32/reader.go#L622

kishaningithub avatar Jul 28 '22 00:07 kishaningithub