Skip to content

Commit e434ce9

Browse files
joeybloggsjoeybloggs
authored andcommitted
Merge branch '2.0'
2 parents 576d799 + 76dccab commit e434ce9

File tree

15 files changed

+4616
-2309
lines changed

15 files changed

+4616
-2309
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## log
22
<img align="right" src="https://raw.githubusercontent.com/go-playground/log/master/logo.png">
3-
![Project status](https://img.shields.io/badge/version-1.4-green.svg)
3+
![Project status](https://img.shields.io/badge/version-2.0-green.svg)
44
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/log/branches/master/badge.svg)](https://semaphoreci.com/joeybloggs/log)
55
[![Coverage Status](https://coveralls.io/repos/github/go-playground/log/badge.svg?branch=master)](https://coveralls.io/github/go-playground/log?branch=master)
66
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/log)](https://goreportcard.com/report/github.com/go-playground/log)

benchmarks/benchmark_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package benchmarks
2+
3+
import (
4+
"errors"
5+
"io/ioutil"
6+
"os"
7+
"testing"
8+
"time"
9+
10+
"github.com/go-playground/log"
11+
"github.com/go-playground/log/handlers/console"
12+
)
13+
14+
var errExample = errors.New("fail")
15+
16+
type user struct {
17+
Name string `json:"name"`
18+
Email string `json:"email"`
19+
CreatedAt time.Time `json:"created_at"`
20+
}
21+
22+
var _jane = user{
23+
Name: "Jane Doe",
24+
25+
CreatedAt: time.Date(1980, 1, 1, 12, 0, 0, 0, time.UTC),
26+
}
27+
28+
const (
29+
newLine = byte('\n')
30+
defaultTS = "2006-01-02T15:04:05.000000000Z07:00"
31+
colorFields = "%s %s%6s%s %-25s"
32+
colorNoFields = "%s %s%6s%s %s"
33+
colorKeyValue = " %s%s%s=%v"
34+
colorFieldsCaller = "%s %s%6s%s %s:%d %-25s"
35+
colorNoFieldsCaller = "%s %s%6s%s %s:%d %s"
36+
noColorFields = "%s %6s %-25s"
37+
noColorNoFields = "%s %6s %s"
38+
noColorKeyValue = " %s=%v"
39+
noColorFieldsCaller = "%s %6s %s:%d %-25s"
40+
noColorNoFieldsCaller = "%s %6s %s:%d %s"
41+
equals = byte('=')
42+
v = "%v"
43+
base10 = 10
44+
space = byte(' ')
45+
colon = byte(':')
46+
)
47+
48+
// NOTE: log is a singleton, which means handlers need to be
49+
// setup only once otherwise each test just adds another log
50+
// handler and results are cumulative... makes benchmarking
51+
// annoying because you have to manipulate the TestMain before
52+
// running the benchmark you want.
53+
func TestMain(m *testing.M) {
54+
55+
cLog := console.New()
56+
cLog.DisplayColor(false)
57+
cLog.SetWriter(ioutil.Discard)
58+
cLog.SetBuffersAndWorkers(3, 3)
59+
60+
log.RegisterHandler(cLog, log.AllLevels...)
61+
62+
os.Exit(m.Run())
63+
}
64+
65+
func BenchmarkConsoleParallel(b *testing.B) {
66+
67+
// log setup in TestMain
68+
b.RunParallel(func(pb *testing.PB) {
69+
for pb.Next() {
70+
log.WithFields(
71+
log.F("int", 1),
72+
log.F("int64", int64(1)),
73+
log.F("float", 3.0),
74+
log.F("string", "four!"),
75+
log.F("bool", true),
76+
log.F("time", time.Unix(0, 0)),
77+
log.F("error", errExample.Error()),
78+
log.F("duration", time.Second),
79+
log.F("user-defined type", _jane),
80+
log.F("another string", "done!"),
81+
).Info("Go fast.")
82+
}
83+
84+
})
85+
}
86+
87+
func BenchmarkConsoleSimpleFieldsParallel(b *testing.B) {
88+
89+
// log setup in TestMain
90+
b.RunParallel(func(pb *testing.PB) {
91+
for pb.Next() {
92+
log.Info("Go fast.")
93+
}
94+
95+
})
96+
}

entry.go

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package log
22

33
import (
44
"fmt"
5-
"runtime"
65
"strings"
76
"sync"
87
"time"
@@ -29,16 +28,14 @@ type Entry struct {
2928
func newEntry(level Level, message string, fields []Field, calldepth int) *Entry {
3029

3130
entry := Logger.entryPool.Get().(*Entry)
31+
entry.Line = 0
32+
entry.File = entry.File[0:0]
3233
entry.calldepth = calldepth
3334
entry.Level = level
3435
entry.Message = strings.TrimRight(message, cutset) // need to trim for adding fields later in handlers + why send uneeded whitespace
3536
entry.Fields = fields
3637
entry.Timestamp = time.Now().UTC()
3738

38-
if Logger.logCallerInfo && level != TraceLevel {
39-
_, entry.File, entry.Line, _ = runtime.Caller(entry.calldepth)
40-
}
41-
4239
return entry
4340
}
4441

@@ -48,7 +45,7 @@ var _ LeveledLogger = new(Entry)
4845
func (e *Entry) Debug(v ...interface{}) {
4946
e.Level = DebugLevel
5047
e.Message = fmt.Sprint(v...)
51-
Logger.handleEntry(e)
48+
Logger.HandleEntry(e)
5249
}
5350

5451
// Trace starts a trace & returns Traceable object to End + log
@@ -68,36 +65,36 @@ func (e *Entry) Trace(v ...interface{}) Traceable {
6865
func (e *Entry) Info(v ...interface{}) {
6966
e.Level = InfoLevel
7067
e.Message = fmt.Sprint(v...)
71-
Logger.handleEntry(e)
68+
Logger.HandleEntry(e)
7269
}
7370

7471
// Notice level formatted message.
7572
func (e *Entry) Notice(v ...interface{}) {
7673
e.Level = NoticeLevel
7774
e.Message = fmt.Sprint(v...)
78-
Logger.handleEntry(e)
75+
Logger.HandleEntry(e)
7976
}
8077

8178
// Warn level message.
8279
func (e *Entry) Warn(v ...interface{}) {
8380
e.Level = WarnLevel
8481
e.Message = fmt.Sprint(v...)
85-
Logger.handleEntry(e)
82+
Logger.HandleEntry(e)
8683
}
8784

8885
// Error level message.
8986
func (e *Entry) Error(v ...interface{}) {
9087
e.Level = ErrorLevel
9188
e.Message = fmt.Sprint(v...)
92-
Logger.handleEntry(e)
89+
Logger.HandleEntry(e)
9390
}
9491

9592
// Panic logs an Error level formatted message and then panics
9693
func (e *Entry) Panic(v ...interface{}) {
9794
s := fmt.Sprint(v...)
9895
e.Level = PanicLevel
9996
e.Message = s
100-
Logger.handleEntry(e)
97+
Logger.HandleEntry(e)
10198

10299
for _, f := range e.Fields {
103100
s += fmt.Sprintf(keyVal, f.Key, f.Value)
@@ -110,22 +107,22 @@ func (e *Entry) Panic(v ...interface{}) {
110107
func (e *Entry) Alert(v ...interface{}) {
111108
e.Level = AlertLevel
112109
e.Message = fmt.Sprint(v...)
113-
Logger.handleEntry(e)
110+
Logger.HandleEntry(e)
114111
}
115112

116113
// Fatal level message, followed by an exit.
117114
func (e *Entry) Fatal(v ...interface{}) {
118115
e.Level = FatalLevel
119116
e.Message = fmt.Sprint(v...)
120-
Logger.handleEntry(e)
117+
Logger.HandleEntry(e)
121118
exitFunc(1)
122119
}
123120

124121
// Debugf level formatted message.
125122
func (e *Entry) Debugf(msg string, v ...interface{}) {
126123
e.Level = DebugLevel
127124
e.Message = fmt.Sprintf(msg, v...)
128-
Logger.handleEntry(e)
125+
Logger.HandleEntry(e)
129126
}
130127

131128
// Tracef starts a trace & returns Traceable object to End + log
@@ -145,36 +142,36 @@ func (e *Entry) Tracef(msg string, v ...interface{}) Traceable {
145142
func (e *Entry) Infof(msg string, v ...interface{}) {
146143
e.Level = InfoLevel
147144
e.Message = fmt.Sprintf(msg, v...)
148-
Logger.handleEntry(e)
145+
Logger.HandleEntry(e)
149146
}
150147

151148
// Noticef level formatted message.
152149
func (e *Entry) Noticef(msg string, v ...interface{}) {
153150
e.Level = NoticeLevel
154151
e.Message = fmt.Sprintf(msg, v...)
155-
Logger.handleEntry(e)
152+
Logger.HandleEntry(e)
156153
}
157154

158155
// Warnf level formatted message.
159156
func (e *Entry) Warnf(msg string, v ...interface{}) {
160157
e.Level = WarnLevel
161158
e.Message = fmt.Sprintf(msg, v...)
162-
Logger.handleEntry(e)
159+
Logger.HandleEntry(e)
163160
}
164161

165162
// Errorf level formatted message.
166163
func (e *Entry) Errorf(msg string, v ...interface{}) {
167164
e.Level = ErrorLevel
168165
e.Message = fmt.Sprintf(msg, v...)
169-
Logger.handleEntry(e)
166+
Logger.HandleEntry(e)
170167
}
171168

172169
// Panicf logs an Error level formatted message and then panics
173170
func (e *Entry) Panicf(msg string, v ...interface{}) {
174171
s := fmt.Sprintf(msg, v...)
175172
e.Level = PanicLevel
176173
e.Message = s
177-
Logger.handleEntry(e)
174+
Logger.HandleEntry(e)
178175

179176
for _, f := range e.Fields {
180177
s += fmt.Sprintf(keyVal, f.Key, f.Value)
@@ -187,14 +184,14 @@ func (e *Entry) Panicf(msg string, v ...interface{}) {
187184
func (e *Entry) Alertf(msg string, v ...interface{}) {
188185
e.Level = AlertLevel
189186
e.Message = fmt.Sprintf(msg, v...)
190-
Logger.handleEntry(e)
187+
Logger.HandleEntry(e)
191188
}
192189

193190
// Fatalf level formatted message, followed by an exit.
194191
func (e *Entry) Fatalf(msg string, v ...interface{}) {
195192
e.Level = FatalLevel
196193
e.Message = fmt.Sprintf(msg, v...)
197-
Logger.handleEntry(e)
194+
Logger.HandleEntry(e)
198195
exitFunc(1)
199196
}
200197

0 commit comments

Comments
 (0)