-
Notifications
You must be signed in to change notification settings - Fork 16
/
logx_test.go
132 lines (107 loc) · 6.84 KB
/
logx_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package logx_test
import (
"bytes"
"fmt"
"io"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/socialpoint-labs/bsk/logx"
)
func TestDefaultAndLogstashLogging(t *testing.T) {
t.Parallel()
a := assert.New(t)
rec := make(recorder, 1)
defaultLogger := logx.New(logx.WriterOpt(rec), logx.WithoutTimeOpt())
defaultLoggerWithoutFileInfo := logx.New(logx.WriterOpt(rec), logx.WithoutTimeOpt(), logx.WithoutFileInfo())
logstashLogger := logx.NewLogstash("mychan", "myprod", "myapp", logx.WriterOpt(rec), logx.WithoutTimeOpt())
logstashLoggerWithOriginalValues := logx.New(logx.MarshalerOpt(logx.NewLogstashMarshaler("mychan", "myprod", "myapp", logx.WithOriginalValueTypes())), logx.WriterOpt(rec), logx.WithoutTimeOpt())
logstashLoggerWithoutFileInfo := logx.NewLogstash("mychan", "myprod", "myapp", logx.WriterOpt(rec), logx.WithoutTimeOpt(), logx.WithoutFileInfo())
logstashLoggerWithEnvironment := logx.New(logx.MarshalerOpt(logx.NewLogstashMarshaler("mychan", "myprod", "myapp", logx.WithEnvironment("prod"))), logx.WriterOpt(rec), logx.WithoutTimeOpt())
hostname, _ := os.Hostname()
for _, tc := range []struct {
logger logx.Logger
message string
fields []logx.Field
output string
}{
{logger: defaultLogger, output: "INFO File: logx_test.go:58\n"},
{logger: defaultLogger, message: "Test", output: "INFO Test File: logx_test.go:58\n"},
{logger: defaultLoggerWithoutFileInfo, message: "Test 2", fields: []logx.Field{logx.F("foo", "some stuff")}, output: "INFO Test 2 FIELDS foo=some stuff\n"},
// "type" is a logstash reserved keyword but just changes in logstash log
{logger: defaultLogger, message: "Test 3", fields: []logx.Field{logx.F("type", "val")}, output: "INFO Test 3 FIELDS type=val File: logx_test.go:56\n"},
{logger: defaultLogger, message: "Test 4", fields: []logx.Field{logx.F("number", 111)}, output: "INFO Test 4 FIELDS number=111 File: logx_test.go:56\n"},
{logger: defaultLoggerWithoutFileInfo, message: "Test 5", fields: []logx.Field{logx.F("type", "val"), logx.F("myint", 111), logx.F("myfloat", 3.1416)}, output: "INFO Test 5 FIELDS type=val myint=111 myfloat=3.1416\n"},
{logger: logstashLogger, output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"file\":\"logx_test.go:58\",\"message\":\"\",\"product\":\"myprod\",\"severity\":\"INFO\"}\n", hostname)},
{logger: logstashLogger, message: "Test", output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"file\":\"logx_test.go:58\",\"message\":\"Test\",\"product\":\"myprod\",\"severity\":\"INFO\"}\n", hostname)},
{logger: logstashLoggerWithoutFileInfo, message: "Test 2", fields: []logx.Field{logx.F("foo", "some stuff")}, output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"foo\":\"some stuff\",\"message\":\"Test 2\",\"product\":\"myprod\",\"severity\":\"INFO\"}\n", hostname)},
// "type" is a logstash reserved keyword but just changes in logstash log
{logger: logstashLogger, message: "Test 3", fields: []logx.Field{logx.F("type", "val")}, output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"file\":\"logx_test.go:56\",\"message\":\"Test 3\",\"product\":\"myprod\",\"severity\":\"INFO\",\"typex\":\"val\"}\n", hostname)},
{logger: logstashLogger, message: "Test 4", fields: []logx.Field{logx.F("number", 111)}, output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"file\":\"logx_test.go:56\",\"message\":\"Test 4\",\"number\":\"111\",\"product\":\"myprod\",\"severity\":\"INFO\"}\n", hostname)},
{logger: logstashLoggerWithoutFileInfo, message: "Test 5", fields: []logx.Field{logx.F("type", "val"), logx.F("number", 111)}, output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"message\":\"Test 5\",\"number\":\"111\",\"product\":\"myprod\",\"severity\":\"INFO\",\"typex\":\"val\"}\n", hostname)},
{logger: logstashLoggerWithOriginalValues, message: "Test With Original Values But No Fields", output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"file\":\"logx_test.go:58\",\"message\":\"Test With Original Values But No Fields\",\"product\":\"myprod\",\"severity\":\"INFO\"}\n", hostname)},
{logger: logstashLoggerWithOriginalValues, message: "Test With Original Values", fields: []logx.Field{logx.F("string", "hi there"), logx.F("number", 123), logx.F("array", []int{1, 2, 3}), logx.F("map", map[string]int{"foo": 123, "bar": 456})}, output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"array\":[1,2,3],\"channel\":\"mychan\",\"file\":\"logx_test.go:56\",\"map\":{\"bar\":456,\"foo\":123},\"message\":\"Test With Original Values\",\"number\":123,\"product\":\"myprod\",\"severity\":\"INFO\",\"string\":\"hi there\"}\n", hostname)},
{logger: logstashLoggerWithEnvironment, message: "Test", output: fmt.Sprintf("{\"@version\":1,\"app_server_name\":\"%s\",\"application\":\"myapp\",\"channel\":\"mychan\",\"environment\":\"prod\",\"file\":\"logx_test.go:58\",\"message\":\"Test\",\"product\":\"myprod\",\"severity\":\"INFO\"}\n", hostname)},
} {
if tc.fields != nil {
tc.logger.Info(tc.message, tc.fields...)
} else {
tc.logger.Info(tc.message)
}
a.Equal(tc.output, <-rec)
}
}
func TestLoggingWithCustomSkipLevel(t *testing.T) {
t.Parallel()
a := assert.New(t)
rec := make(recorder, 1)
defaultLogger := logx.New(logx.WriterOpt(rec), logx.WithoutTimeOpt(), logx.AdditionalFileSkipLevel(1))
log(defaultLogger, "Test")
a.Equal("INFO Test File: logx_test.go:70\n", <-rec)
}
func log(logger logx.Logger, message string) {
logger.Info(message)
}
func TestLogLevel(t *testing.T) {
t.Parallel()
a := assert.New(t)
var buf bytes.Buffer
logger := logx.New(logx.WriterOpt(&buf))
logger.Info("test")
content, err := io.ReadAll(&buf)
a.NoError(err)
a.True(len(content) > 0)
logger.Error("test2")
content, err = io.ReadAll(&buf)
a.NoError(err)
a.True(len(content) > 0)
logger = logx.New(logx.WriterOpt(&buf), logx.LevelOpt(logx.ErrorLevel))
// since now the min level is error then a debug message won't be logged
logger.Info("test")
content, err = io.ReadAll(&buf)
a.NoError(err)
a.Len(content, 0)
logger.Error("test2")
content, err = io.ReadAll(&buf)
a.NoError(err)
a.True(len(content) > 0)
}
func TestDummy(t *testing.T) {
t.Parallel()
a := assert.New(t)
var buf bytes.Buffer
logger := logx.NewDummy(logx.WriterOpt(&buf))
logger.Info("test")
content, err := io.ReadAll(&buf)
a.NoError(err)
a.Len(content, 0)
logger.Error("test2")
content, err = io.ReadAll(&buf)
a.NoError(err)
a.Len(content, 0)
}
type recorder chan string
func (r recorder) Write(b []byte) (n int, err error) {
r <- string(b)
return len(b), nil
}