log: notes and tests re: concurrent access
Addresses #24
Peter Bourgon
9 years ago
|
0 |
package log_test
|
|
1 |
|
|
2 |
import (
|
|
3 |
"strconv"
|
|
4 |
"sync"
|
|
5 |
"testing"
|
|
6 |
|
|
7 |
"github.com/peterbourgon/gokit/log"
|
|
8 |
)
|
|
9 |
|
|
10 |
// These test are designed to be run with the race detector.
|
|
11 |
|
|
12 |
func testConcurrency(t *testing.T, logger log.Logger) {
|
|
13 |
for _, n := range []int{10, 100, 500} {
|
|
14 |
wg := sync.WaitGroup{}
|
|
15 |
wg.Add(n)
|
|
16 |
for i := 0; i < n; i++ {
|
|
17 |
go func() { spam(logger); wg.Done() }()
|
|
18 |
}
|
|
19 |
wg.Wait()
|
|
20 |
}
|
|
21 |
}
|
|
22 |
|
|
23 |
func spam(logger log.Logger) {
|
|
24 |
for i := 0; i < 100; i++ {
|
|
25 |
logger.Log("key", strconv.FormatInt(int64(i), 10))
|
|
26 |
}
|
|
27 |
}
|
26 | 26 |
func BenchmarkJSONLoggerContextual(b *testing.B) {
|
27 | 27 |
benchmarkRunner(b, log.NewJSONLogger(ioutil.Discard), withMessage)
|
28 | 28 |
}
|
|
29 |
|
|
30 |
func TestJSONLoggerConcurrency(t *testing.T) {
|
|
31 |
testConcurrency(t, log.NewJSONLogger(ioutil.Discard))
|
|
32 |
}
|
7 | 7 |
//
|
8 | 8 |
// Log creates a log event from keyvals, a variadic sequence of alternating
|
9 | 9 |
// keys and values.
|
|
10 |
//
|
|
11 |
// Logger implementations must be safe for concurrent use by multiple
|
|
12 |
// goroutines.
|
10 | 13 |
type Logger interface {
|
11 | 14 |
Log(keyvals ...interface{}) error
|
12 | 15 |
}
|
36 | 36 |
}
|
37 | 37 |
}
|
38 | 38 |
|
39 | |
type mymap map[int]int
|
40 | |
|
41 | |
func (m mymap) String() string { return "special_behavior" }
|
42 | |
|
43 | 39 |
func BenchmarkPrefixLoggerSimple(b *testing.B) {
|
44 | 40 |
benchmarkRunner(b, log.NewPrefixLogger(ioutil.Discard), baseMessage)
|
45 | 41 |
}
|
|
47 | 43 |
func BenchmarkPrefixLoggerContextual(b *testing.B) {
|
48 | 44 |
benchmarkRunner(b, log.NewPrefixLogger(ioutil.Discard), withMessage)
|
49 | 45 |
}
|
|
46 |
|
|
47 |
func TestPrefixLoggerConcurrency(t *testing.T) {
|
|
48 |
testConcurrency(t, log.NewPrefixLogger(ioutil.Discard))
|
|
49 |
}
|
|
50 |
|
|
51 |
type mymap map[int]int
|
|
52 |
|
|
53 |
func (m mymap) String() string { return "special_behavior" }
|