348bace269
in the Logrus context it's the caller, so use that internally. Label stays as 'method' since in the context of the log event that seems more correct.
54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package logrus
|
|
|
|
import "time"
|
|
|
|
// DefaultTimestampFormat is YYYY-mm-DDTHH:MM:SS-TZ
|
|
const DefaultTimestampFormat = time.RFC3339
|
|
|
|
// The Formatter interface is used to implement a custom Formatter. It takes an
|
|
// `Entry`. It exposes all the fields, including the default ones:
|
|
//
|
|
// * `entry.Data["msg"]`. The message passed from Info, Warn, Error ..
|
|
// * `entry.Data["time"]`. The timestamp.
|
|
// * `entry.Data["level"]. The level the entry was logged at.
|
|
//
|
|
// Any additional fields added with `WithField` or `WithFields` are also in
|
|
// `entry.Data`. Format is expected to return an array of bytes which are then
|
|
// logged to `logger.Out`.
|
|
type Formatter interface {
|
|
Format(*Entry) ([]byte, error)
|
|
}
|
|
|
|
// This is to not silently overwrite `time`, `msg`, `method` and `level` fields when
|
|
// dumping it. If this code wasn't there doing:
|
|
//
|
|
// logrus.WithField("level", 1).Info("hello")
|
|
//
|
|
// Would just silently drop the user provided level. Instead with this code
|
|
// it'll logged as:
|
|
//
|
|
// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."}
|
|
//
|
|
// It's not exported because it's still using Data in an opinionated way. It's to
|
|
// avoid code duplication between the two default formatters.
|
|
func prefixFieldClashes(data Fields) {
|
|
if t, ok := data["time"]; ok {
|
|
data["fields.time"] = t
|
|
}
|
|
|
|
if m, ok := data["msg"]; ok {
|
|
data["fields.msg"] = m
|
|
}
|
|
|
|
if l, ok := data["level"]; ok {
|
|
data["fields.level"] = l
|
|
}
|
|
|
|
// If Reportmethod is not set, 'method' will not conflict.
|
|
if ReportCaller() {
|
|
if l, ok := data["method"]; ok {
|
|
data["fields.method"] = l
|
|
}
|
|
}
|
|
}
|