Skip to content

Commit b827981

Browse files
committed
Add optional formatter to writer hook
sirupsen#1184
1 parent cd4bf4e commit b827981

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

hooks/writer/writer.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,30 @@ import (
77
)
88

99
// Hook is a hook that writes logs of specified LogLevels to specified Writer
10+
// If Formatter is not nil, then it would used to format log entries before
11+
// writing
1012
type Hook struct {
1113
Writer io.Writer
1214
LogLevels []log.Level
15+
Formatter log.Formatter
1316
}
1417

1518
// Fire will be called when some logging function is called with current hook
1619
// It will format log entry to string and write it to appropriate writer
1720
func (hook *Hook) Fire(entry *log.Entry) error {
18-
line, err := entry.Bytes()
21+
var line []byte
22+
var err error
23+
24+
if hook.Formatter != nil {
25+
line, err = hook.Formatter.Format(entry)
26+
} else {
27+
line, err = entry.Bytes()
28+
}
29+
1930
if err != nil {
2031
return err
2132
}
33+
2234
_, err = hook.Writer.Write(line)
2335
return err
2436
}

hooks/writer/writer_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,41 @@ func TestDifferentLevelsGoToDifferentWriters(t *testing.T) {
3636
assert.Equal(t, a.String(), "level=warning msg=\"send to a\"\n")
3737
assert.Equal(t, b.String(), "level=info msg=\"send to b\"\n")
3838
}
39+
40+
func TestDifferentFormattersToDifferentWritter(t *testing.T) {
41+
var a, b bytes.Buffer
42+
43+
log.SetOutput(ioutil.Discard) // Send all logs to nowhere by default
44+
45+
log.AddHook(&Hook{
46+
Writer: &a,
47+
LogLevels: []log.Level{
48+
log.WarnLevel,
49+
},
50+
Formatter: &log.TextFormatter{
51+
DisableTimestamp: true,
52+
DisableColors: true,
53+
FieldMap: log.FieldMap{
54+
log.FieldKeyLevel: "@level",
55+
log.FieldKeyMsg: "@message",
56+
},
57+
},
58+
})
59+
log.AddHook(&Hook{ // Send info and debug logs to stdout
60+
Writer: &b,
61+
LogLevels: []log.Level{
62+
log.InfoLevel,
63+
},
64+
Formatter: &log.JSONFormatter{
65+
DisableTimestamp: true,
66+
FieldMap: log.FieldMap{
67+
log.FieldKeyMsg: "message",
68+
},
69+
},
70+
})
71+
log.Warn("send to a")
72+
log.Info("send to b")
73+
74+
assert.Equal(t, a.String(), "@level=warning @message=\"send to a\"\n")
75+
assert.Equal(t, b.String(), "{\"level\":\"info\",\"message\":\"send to b\"}\n")
76+
}

0 commit comments

Comments
 (0)