logging: support ignoring fields in HumanFormatter

should be refactored to logger one day so the implementation of ignoring
is not duplicated to each outlet.

refs #10
This commit is contained in:
Christian Schwarz 2017-12-23 01:22:38 +01:00
parent 51377a8ffb
commit ebf209427a

View File

@ -41,12 +41,29 @@ func (f NoFormatter) Format(e *logger.Entry) ([]byte, error) {
type HumanFormatter struct { type HumanFormatter struct {
metadataFlags MetadataFlags metadataFlags MetadataFlags
ignoreFields map[string]bool
} }
func (f *HumanFormatter) SetMetadataFlags(flags MetadataFlags) { func (f *HumanFormatter) SetMetadataFlags(flags MetadataFlags) {
f.metadataFlags = flags f.metadataFlags = flags
} }
func (f *HumanFormatter) SetIgnoreFields(ignore []string) {
if ignore == nil {
f.ignoreFields = nil
return
}
f.ignoreFields = make(map[string]bool, len(ignore))
for _, field := range ignore {
f.ignoreFields[field] = true
}
}
func (f *HumanFormatter) ignored(field string) bool {
return f.ignoreFields != nil && f.ignoreFields[field]
}
func (f *HumanFormatter) Format(e *logger.Entry) (out []byte, err error) { func (f *HumanFormatter) Format(e *logger.Entry) (out []byte, err error) {
var line bytes.Buffer var line bytes.Buffer
@ -63,8 +80,10 @@ func (f *HumanFormatter) Format(e *logger.Entry) (out []byte, err error) {
for _, field := range prefixFields { for _, field := range prefixFields {
val, ok := e.Fields[field].(string) val, ok := e.Fields[field].(string)
if ok { if ok {
fmt.Fprintf(&line, "[%s]", val) if !f.ignored(field) {
prefixed[field] = true fmt.Fprintf(&line, "[%s]", val)
prefixed[field] = true
}
} else { } else {
break break
} }
@ -72,13 +91,13 @@ func (f *HumanFormatter) Format(e *logger.Entry) (out []byte, err error) {
// even more prefix fields // even more prefix fields
mapFrom, mapFromOk := e.Fields[logMapFromField].(string) mapFrom, mapFromOk := e.Fields[logMapFromField].(string)
mapTo, mapToOk := e.Fields[logMapToField].(string) mapTo, mapToOk := e.Fields[logMapToField].(string)
if mapFromOk && mapToOk { if mapFromOk && mapToOk && !f.ignored(logMapFromField) && !f.ignored(logMapToField) {
fmt.Fprintf(&line, "[%s => %s]", mapFrom, mapTo) fmt.Fprintf(&line, "[%s => %s]", mapFrom, mapTo)
prefixed[logMapFromField], prefixed[logMapToField] = true, true prefixed[logMapFromField], prefixed[logMapToField] = true, true
} }
incFrom, incFromOk := e.Fields[logIncFromField].(string) incFrom, incFromOk := e.Fields[logIncFromField].(string)
incTo, incToOk := e.Fields[logIncToField].(string) incTo, incToOk := e.Fields[logIncToField].(string)
if incFromOk && incToOk { if incFromOk && incToOk && !f.ignored(logIncFromField) && !f.ignored(logMapToField) {
fmt.Fprintf(&line, "[%s => %s]", incFrom, incTo) fmt.Fprintf(&line, "[%s => %s]", incFrom, incTo)
prefixed[logIncFromField], prefixed[logIncToField] = true, true prefixed[logIncFromField], prefixed[logIncToField] = true, true
} }
@ -92,7 +111,7 @@ func (f *HumanFormatter) Format(e *logger.Entry) (out []byte, err error) {
fmt.Fprint(&line, " ") fmt.Fprint(&line, " ")
enc := logfmt.NewEncoder(&line) enc := logfmt.NewEncoder(&line)
for field, value := range e.Fields { for field, value := range e.Fields {
if prefixed[field] { if prefixed[field] || f.ignored(field) {
continue continue
} }
if err := logfmtTryEncodeKeyval(enc, field, value); err != nil { if err := logfmtTryEncodeKeyval(enc, field, value); err != nil {