inconshreveable / log15

Structured, composable logging for Go
https://godoc.org/github.com/inconshreveable/log15
Other
1.1k stars 145 forks source link

Control amount of padding #83

Open kevinburke opened 8 years ago

kevinburke commented 8 years ago

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.

inconshreveable commented 8 years ago

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

ChrisHines commented 8 years ago

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

inconshreveable commented 8 years ago

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?

ChrisHines commented 8 years ago

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.

kishaningithub commented 2 years ago

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