Skip to content

Commit 20ecf1a

Browse files
committed
[FAB-12942] use logfmt format for log fields
Change-Id: Ibbbf4f55bd42a0914edc4b247c391e020b3a68a4 Signed-off-by: Matthew Sykes <sykesmat@us.ibm.com>
1 parent bccbd4d commit 20ecf1a

File tree

11 files changed

+593
-12
lines changed

11 files changed

+593
-12
lines changed

Gopkg.lock

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ noverify = [
153153
name = "go.uber.org/zap"
154154
version = "1.9.0"
155155

156+
[[constraint]]
157+
branch = "master"
158+
name = "github.com/sykesm/zap-logfmt"
159+
156160
[[constraint]]
157161
name = "github.com/grpc-ecosystem/go-grpc-middleware"
158162
version = "1.0.0"

common/flogging/core.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ type Encoding int8
1515
const (
1616
CONSOLE = iota
1717
JSON
18+
LOGFMT
1819
)
1920

2021
// EncodingSelector is used to determine whether log records are
21-
// encoded as JSON or in a human readable CONSOLE format.
22+
// encoded as JSON or in human readable CONSOLE or LOGFMT formats.
2223
type EncodingSelector interface {
2324
Encoding() Encoding
2425
}

common/flogging/fabenc/encoder.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"io"
1111
"time"
1212

13+
zaplogfmt "github.com/sykesm/zap-logfmt"
1314
"go.uber.org/zap/buffer"
1415
"go.uber.org/zap/zapcore"
1516
)
@@ -29,7 +30,7 @@ type Formatter interface {
2930

3031
func NewFormatEncoder(formatters ...Formatter) *FormatEncoder {
3132
return &FormatEncoder{
32-
Encoder: zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
33+
Encoder: zaplogfmt.NewEncoder(zapcore.EncoderConfig{
3334
MessageKey: "", // disable
3435
LevelKey: "", // disable
3536
TimeKey: "", // disable

common/flogging/fabenc/encoder_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ func TestEncodeEntry(t *testing.T) {
2929
expected string
3030
}{
3131
{name: "empty spec and nil fields", spec: "", fields: nil, expected: "\n"},
32-
{name: "empty spec with fields", spec: "", fields: []zapcore.Field{zap.String("key", "value")}, expected: `{"key": "value"}` + "\n"},
32+
{name: "empty spec with fields", spec: "", fields: []zapcore.Field{zap.String("key", "value")}, expected: "key=value\n"},
3333
{name: "simple spec and nil fields", spec: "simple-string", expected: "simple-string\n"},
3434
{name: "simple spec and empty fields", spec: "simple-string", fields: []zapcore.Field{}, expected: "simple-string\n"},
35-
{name: "simple spec with fields", spec: "simple-string", fields: []zapcore.Field{zap.String("key", "value")}, expected: `simple-string {"key": "value"}` + "\n"},
36-
{name: "duration", spec: "", fields: []zapcore.Field{zap.Duration("duration", time.Second)}, expected: `{"duration": "1s"}` + "\n"},
37-
{name: "time", spec: "", fields: []zapcore.Field{zap.Time("time", startTime)}, expected: fmt.Sprintf(`{"time": "%s"}`+"\n", startTime.Format("2006-01-02T15:04:05.999Z07:00"))},
35+
{name: "simple spec with fields", spec: "simple-string", fields: []zapcore.Field{zap.String("key", "value")}, expected: "simple-string key=value\n"},
36+
{name: "duration", spec: "", fields: []zapcore.Field{zap.Duration("duration", time.Second)}, expected: "duration=1s\n"},
37+
{name: "time", spec: "", fields: []zapcore.Field{zap.Time("time", startTime)}, expected: fmt.Sprintf("time=%s\n", startTime.Format("2006-01-02T15:04:05.999Z07:00"))},
3838
}
3939

4040
for _, tc := range tests {

common/flogging/floggingtest/logger_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,5 @@ func TestRecordingCoreWith(t *testing.T) {
8888
logger = logger.With("key", "value")
8989

9090
logger.Debug("message")
91-
gt.Expect(recorder).To(gbytes.Say(`message {"key": "value"}`))
91+
gt.Expect(recorder).To(gbytes.Say(`message key=value`))
9292
}

common/flogging/global_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@ func TestGlobalInitJSON(t *testing.T) {
6464
assert.Regexp(t, `{"level":"debug","ts":\d+.\d+,"name":"testlogger","caller":"flogging/global_test.go:\d+","msg":"this is a message"}\s+`, buf.String())
6565
}
6666

67+
func TestGlobalInitLogfmt(t *testing.T) {
68+
flogging.Reset()
69+
defer flogging.Reset()
70+
71+
buf := &bytes.Buffer{}
72+
flogging.Init(flogging.Config{
73+
Format: "logfmt",
74+
LogSpec: "DEBUG",
75+
Writer: buf,
76+
})
77+
78+
logger := flogging.MustGetLogger("testlogger")
79+
logger.Debug("this is a message")
80+
81+
assert.Regexp(t, `^ts=\d+.\d+ level=debug name=testlogger caller=flogging/global_test.go:\d+ msg="this is a message"`, buf.String())
82+
}
83+
6784
func TestGlobalInitPanic(t *testing.T) {
6885
flogging.Reset()
6986
defer flogging.Reset()

common/flogging/logging.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/hyperledger/fabric/common/flogging/fabenc"
1616
logging "github.com/op/go-logging"
17+
zaplogfmt "github.com/sykesm/zap-logfmt"
1718
"go.uber.org/zap"
1819
"go.uber.org/zap/zapcore"
1920
)
@@ -101,9 +102,10 @@ func (s *Logging) Apply(c Config) error {
101102
s.SetWriter(c.Writer)
102103

103104
var formatter logging.Formatter
104-
if s.Encoding() == JSON {
105+
switch s.Encoding() {
106+
case JSON, LOGFMT:
105107
formatter = SetFormat(defaultFormat)
106-
} else {
108+
default:
107109
formatter = SetFormat(c.Format)
108110
}
109111

@@ -128,6 +130,11 @@ func (s *Logging) SetFormat(format string) error {
128130
return nil
129131
}
130132

133+
if format == "logfmt" {
134+
s.encoding = LOGFMT
135+
return nil
136+
}
137+
131138
formatters, err := fabenc.ParseFormat(format)
132139
if err != nil {
133140
return err
@@ -214,6 +221,7 @@ func (s *Logging) ZapLogger(name string) *zap.Logger {
214221
Encoders: map[Encoding]zapcore.Encoder{
215222
JSON: zapcore.NewJSONEncoder(s.encoderConfig),
216223
CONSOLE: fabenc.NewFormatEncoder(s.multiFormatter),
224+
LOGFMT: zaplogfmt.NewEncoder(s.encoderConfig),
217225
},
218226
Selector: s,
219227
Output: s,

common/flogging/zap_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ func TestFabricLoggerEncoding(t *testing.T) {
3333

3434
buf.Reset()
3535
fl.Info("string value", 0, 1.23, struct{}{})
36-
assert.Equal(t, "\x1b[34m[test] TestFabricLoggerEncoding -> INFO\x1b[0m string value 0 1.23 {} {\"extra\": \"field\"}\n", buf.String())
36+
assert.Equal(t, "\x1b[34m[test] TestFabricLoggerEncoding -> INFO\x1b[0m string value 0 1.23 {} extra=field\n", buf.String())
3737

3838
buf.Reset()
3939
fl.Infof("string %s, %d, %.3f, %v", "strval", 0, 1.23, struct{}{})
40-
assert.Equal(t, "\x1b[34m[test] TestFabricLoggerEncoding -> INFO\x1b[0m string strval, 0, 1.230, {} {\"extra\": \"field\"}\n", buf.String())
40+
assert.Equal(t, "\x1b[34m[test] TestFabricLoggerEncoding -> INFO\x1b[0m string strval, 0, 1.230, {} extra=field\n", buf.String())
4141

4242
buf.Reset()
4343
fl.Infow("this is a message", "int", 0, "float", 1.23, "struct", struct{}{})
44-
assert.Equal(t, "\x1b[34m[test] TestFabricLoggerEncoding -> INFO\x1b[0m this is a message {\"extra\": \"field\", \"int\": 0, \"float\": 1.23, \"struct\": {}}\n", buf.String())
44+
assert.Equal(t, "\x1b[34m[test] TestFabricLoggerEncoding -> INFO\x1b[0m this is a message extra=field int=0 float=1.23 struct={}\n", buf.String())
4545
}
4646

4747
func TestFabricLogger(t *testing.T) {

vendor/github.com/sykesm/zap-logfmt/LICENSE

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)