1package log_test
2
3import (
4	"math/rand"
5	"os"
6	"sync"
7	"time"
8
9	"github.com/go-kit/log"
10)
11
12func Example_basic() {
13	logger := log.NewLogfmtLogger(os.Stdout)
14
15	type Task struct {
16		ID int
17	}
18
19	RunTask := func(task Task, logger log.Logger) {
20		logger.Log("taskID", task.ID, "event", "starting task")
21
22		logger.Log("taskID", task.ID, "event", "task complete")
23	}
24
25	RunTask(Task{ID: 1}, logger)
26
27	// Output:
28	// taskID=1 event="starting task"
29	// taskID=1 event="task complete"
30}
31
32func Example_contextual() {
33	logger := log.NewLogfmtLogger(os.Stdout)
34
35	type Task struct {
36		ID  int
37		Cmd string
38	}
39
40	taskHelper := func(cmd string, logger log.Logger) {
41		// execute(cmd)
42		logger.Log("cmd", cmd, "dur", 42*time.Millisecond)
43	}
44
45	RunTask := func(task Task, logger log.Logger) {
46		logger = log.With(logger, "taskID", task.ID)
47		logger.Log("event", "starting task")
48
49		taskHelper(task.Cmd, logger)
50
51		logger.Log("event", "task complete")
52	}
53
54	RunTask(Task{ID: 1, Cmd: "echo Hello, world!"}, logger)
55
56	// Output:
57	// taskID=1 event="starting task"
58	// taskID=1 cmd="echo Hello, world!" dur=42ms
59	// taskID=1 event="task complete"
60}
61
62func Example_valuer() {
63	logger := log.NewLogfmtLogger(os.Stdout)
64
65	count := 0
66	counter := func() interface{} {
67		count++
68		return count
69	}
70
71	logger = log.With(logger, "count", log.Valuer(counter))
72
73	logger.Log("call", "first")
74	logger.Log("call", "second")
75
76	// Output:
77	// count=1 call=first
78	// count=2 call=second
79}
80
81func Example_debugInfo() {
82	logger := log.NewLogfmtLogger(os.Stdout)
83
84	// make time predictable for this test
85	baseTime := time.Date(2015, time.February, 3, 10, 0, 0, 0, time.UTC)
86	mockTime := func() time.Time {
87		baseTime = baseTime.Add(time.Second)
88		return baseTime
89	}
90
91	logger = log.With(logger, "time", log.Timestamp(mockTime), "caller", log.DefaultCaller)
92
93	logger.Log("call", "first")
94	logger.Log("call", "second")
95
96	// ...
97
98	logger.Log("call", "third")
99
100	// Output:
101	// time=2015-02-03T10:00:01Z caller=example_test.go:93 call=first
102	// time=2015-02-03T10:00:02Z caller=example_test.go:94 call=second
103	// time=2015-02-03T10:00:03Z caller=example_test.go:98 call=third
104}
105
106func Example_syncWriter() {
107	w := log.NewSyncWriter(os.Stdout)
108	logger := log.NewLogfmtLogger(w)
109
110	type Task struct {
111		ID int
112	}
113
114	var wg sync.WaitGroup
115
116	RunTask := func(task Task, logger log.Logger) {
117		logger.Log("taskID", task.ID, "event", "starting task")
118
119		time.Sleep(time.Duration(rand.Intn(200)) * time.Millisecond)
120
121		logger.Log("taskID", task.ID, "event", "task complete")
122		wg.Done()
123	}
124
125	wg.Add(2)
126
127	go RunTask(Task{ID: 1}, logger)
128	go RunTask(Task{ID: 2}, logger)
129
130	wg.Wait()
131
132	// Unordered output:
133	// taskID=1 event="starting task"
134	// taskID=2 event="starting task"
135	// taskID=1 event="task complete"
136	// taskID=2 event="task complete"
137}
138