From b2a116863cbf080a5f80201c9ea843c25919d061 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 8 May 2017 17:30:21 +0400 Subject: [PATCH 1/2] squash module key if multiple keyvals were provided last keyvalue wins --- log/tm_logger.go | 3 ++- log/tmfmt_logger.go | 38 ++++++++++++++++++++++---------------- log/tmfmt_logger_test.go | 6 ++++++ 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/log/tm_logger.go b/log/tm_logger.go index a6a6f6d3..370aa7c0 100644 --- a/log/tm_logger.go +++ b/log/tm_logger.go @@ -10,7 +10,8 @@ import ( ) const ( - msgKey = "_msg" // "_" prefixed to avoid collisions + msgKey = "_msg" // "_" prefixed to avoid collisions + moduleKey = "module" ) type tmLogger struct { diff --git a/log/tmfmt_logger.go b/log/tmfmt_logger.go index 4e36de89..362fbf28 100644 --- a/log/tmfmt_logger.go +++ b/log/tmfmt_logger.go @@ -51,13 +51,15 @@ func (l tmfmtLogger) Log(keyvals ...interface{}) error { lvl := "none" msg := "unknown" - lvlIndex := -1 - msgIndex := -1 + module := "unknown" + + // indexes of keys to skip while encoding later + excludeIndexes := make([]int, 0) for i := 0; i < len(keyvals)-1; i += 2 { // Extract level if keyvals[i] == kitlevel.Key() { - lvlIndex = i + excludeIndexes = append(excludeIndexes, i) switch keyvals[i+1].(type) { case string: lvl = keyvals[i+1].(string) @@ -66,18 +68,14 @@ func (l tmfmtLogger) Log(keyvals ...interface{}) error { default: panic(fmt.Sprintf("level value of unknown type %T", keyvals[i+1])) } - continue - } - - // and message - if keyvals[i] == msgKey { - msgIndex = i + // and message + } else if keyvals[i] == msgKey { + excludeIndexes = append(excludeIndexes, i) msg = keyvals[i+1].(string) - continue - } - - if lvlIndex > 0 && msgIndex > 0 { // found all we're looking for - break + // and module (could be multiple keyvals; if such case last keyvalue wins) + } else if keyvals[i] == moduleKey { + excludeIndexes = append(excludeIndexes, i) + module = keyvals[i+1].(string) } } @@ -92,10 +90,18 @@ func (l tmfmtLogger) Log(keyvals ...interface{}) error { // Stopping ... - message enc.buf.WriteString(fmt.Sprintf("%c[%s] %-44s", lvl[0]-32, time.Now().UTC().Format("01-02|15:04:05.000"), msg)) + if module != "unknown" { + enc.buf.WriteString("module=" + module + " ") + } + +KeyvalueLoop: for i := 0; i < len(keyvals)-1; i += 2 { - if i == lvlIndex || i == msgIndex { - continue + for _, j := range excludeIndexes { + if i == j { + continue KeyvalueLoop + } } + if err := enc.EncodeKeyval(keyvals[i], keyvals[i+1]); err != nil { return err } diff --git a/log/tmfmt_logger_test.go b/log/tmfmt_logger_test.go index c5ec4127..62eb32a0 100644 --- a/log/tmfmt_logger_test.go +++ b/log/tmfmt_logger_test.go @@ -44,6 +44,12 @@ func TestTMFmtLogger(t *testing.T) { t.Fatal(err) } assert.Regexp(t, regexp.MustCompile(`N\[.+\] Hello \s+\n$`), buf.String()) + + buf.Reset() + if err := logger.Log("module", "main", "module", "crypto", "module", "wire"); err != nil { + t.Fatal(err) + } + assert.Regexp(t, regexp.MustCompile(`N\[.+\] unknown \s+module=wire\s+\n$`), buf.String()) } func BenchmarkTMFmtLoggerSimple(b *testing.B) { From f202d02d0da8172c1d8e9d630cedf8c91f5fd4f8 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 12 May 2017 17:39:00 +0200 Subject: [PATCH 2/2] [log] add separator --- log/tmfmt_logger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log/tmfmt_logger.go b/log/tmfmt_logger.go index 362fbf28..14028d75 100644 --- a/log/tmfmt_logger.go +++ b/log/tmfmt_logger.go @@ -88,7 +88,7 @@ func (l tmfmtLogger) Log(keyvals ...interface{}) error { // D - first character of the level, uppercase (ASCII only) // [05-02|11:06:44.322] - our time format (see https://golang.org/src/time/format.go) // Stopping ... - message - enc.buf.WriteString(fmt.Sprintf("%c[%s] %-44s", lvl[0]-32, time.Now().UTC().Format("01-02|15:04:05.000"), msg)) + enc.buf.WriteString(fmt.Sprintf("%c[%s] %-44s ", lvl[0]-32, time.Now().UTC().Format("01-02|15:04:05.000"), msg)) if module != "unknown" { enc.buf.WriteString("module=" + module + " ")