Add a CallerPrettyfier callback to the text formatter

This commit is contained in:
David Bariod 2019-02-27 13:34:02 +01:00
parent 5e9b246bea
commit ffec2f2e0a
3 changed files with 36 additions and 5 deletions

View File

@ -40,7 +40,7 @@ func LogAndAssertText(t *testing.T, log func(*Logger), assertions func(fields ma
log(logger) log(logger)
fields := make(map[string]string) fields := make(map[string]string)
for _, kv := range strings.Split(buffer.String(), " ") { for _, kv := range strings.Split(strings.TrimRight(buffer.String(), "\n"), " ") {
if !strings.Contains(kv, "=") { if !strings.Contains(kv, "=") {
continue continue
} }

View File

@ -53,6 +53,17 @@ func TestReportCallerWhenConfigured(t *testing.T) {
assert.Equal(t, "somekindoffunc", fields[FieldKeyFunc]) assert.Equal(t, "somekindoffunc", fields[FieldKeyFunc])
assert.Equal(t, "thisisafilename", fields[FieldKeyFile]) assert.Equal(t, "thisisafilename", fields[FieldKeyFile])
}) })
LogAndAssertText(t, func(log *Logger) {
log.ReportCaller = true
log.Formatter.(*TextFormatter).CallerPrettyfier = func(f *runtime.Frame) (string, string) {
return "somekindoffunc", "thisisafilename"
}
log.Print("testWithCallerPrettyfier")
}, func(fields map[string]string) {
assert.Equal(t, "somekindoffunc", fields[FieldKeyFunc])
assert.Equal(t, "thisisafilename", fields[FieldKeyFile])
})
} }
func logSomething(t *testing.T, message string) Fields { func logSomething(t *testing.T, message string) Fields {

View File

@ -72,6 +72,12 @@ type TextFormatter struct {
// FieldKeyMsg: "@message"}} // FieldKeyMsg: "@message"}}
FieldMap FieldMap FieldMap FieldMap
// CallerPrettyfier can be set by the user to modify the content
// of the function and file keys in the json data when ReportCaller is
// activated. If any of the returned value is the empty string the
// corresponding key will be removed from json fields.
CallerPrettyfier func(*runtime.Frame) (function string, file string)
terminalInitOnce sync.Once terminalInitOnce sync.Once
} }
@ -113,6 +119,8 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
keys = append(keys, k) keys = append(keys, k)
} }
var funcVal, fileVal string
fixedKeys := make([]string, 0, 4+len(data)) fixedKeys := make([]string, 0, 4+len(data))
if !f.DisableTimestamp { if !f.DisableTimestamp {
fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime)) fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime))
@ -127,6 +135,12 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
if entry.HasCaller() { if entry.HasCaller() {
fixedKeys = append(fixedKeys, fixedKeys = append(fixedKeys,
f.FieldMap.resolve(FieldKeyFunc), f.FieldMap.resolve(FieldKeyFile)) f.FieldMap.resolve(FieldKeyFunc), f.FieldMap.resolve(FieldKeyFile))
if f.CallerPrettyfier != nil {
funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
} else {
funcVal = entry.Caller.Function
fileVal = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
}
} }
if !f.DisableSorting { if !f.DisableSorting {
@ -161,6 +175,7 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
if f.isColored() { if f.isColored() {
f.printColored(b, entry, keys, data, timestampFormat) f.printColored(b, entry, keys, data, timestampFormat)
} else { } else {
for _, key := range fixedKeys { for _, key := range fixedKeys {
var value interface{} var value interface{}
switch { switch {
@ -173,9 +188,9 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
case key == f.FieldMap.resolve(FieldKeyLogrusError): case key == f.FieldMap.resolve(FieldKeyLogrusError):
value = entry.err value = entry.err
case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller(): case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller():
value = entry.Caller.Function value = funcVal
case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller(): case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller():
value = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) value = fileVal
default: default:
value = data[key] value = data[key]
} }
@ -212,8 +227,13 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin
caller := "" caller := ""
if entry.HasCaller() { if entry.HasCaller() {
caller = fmt.Sprintf("%s:%d %s()", funcVal := fmt.Sprintf("%s()", entry.Caller.Function)
entry.Caller.File, entry.Caller.Line, entry.Caller.Function) fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
if f.CallerPrettyfier != nil {
funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
}
caller = fileVal + " " + funcVal
} }
if f.DisableTimestamp { if f.DisableTimestamp {