1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package zap_test
22
23 import (
24 "encoding/json"
25 "io"
26 "log"
27 "os"
28 "time"
29
30 "go.uber.org/zap"
31 "go.uber.org/zap/zapcore"
32 )
33
34 func Example_presets() {
35
36
37 logger := zap.NewExample()
38 defer logger.Sync()
39
40 const url = "http://example.com"
41
42
43
44 sugar := logger.Sugar()
45 sugar.Infow("Failed to fetch URL.",
46
47 "url", url,
48 "attempt", 3,
49 "backoff", time.Second,
50 )
51 sugar.Infof("Failed to fetch URL: %s", url)
52
53
54
55
56 logger.Info("Failed to fetch URL.",
57
58 zap.String("url", url),
59 zap.Int("attempt", 3),
60 zap.Duration("backoff", time.Second),
61 )
62
63
64
65
66 }
67
68 func Example_basicConfiguration() {
69
70
71
72
73
74
75
76
77 rawJSON := []byte(`{
78 "level": "debug",
79 "encoding": "json",
80 "outputPaths": ["stdout", "/tmp/logs"],
81 "errorOutputPaths": ["stderr"],
82 "initialFields": {"foo": "bar"},
83 "encoderConfig": {
84 "messageKey": "message",
85 "levelKey": "level",
86 "levelEncoder": "lowercase"
87 }
88 }`)
89
90 var cfg zap.Config
91 if err := json.Unmarshal(rawJSON, &cfg); err != nil {
92 panic(err)
93 }
94 logger := zap.Must(cfg.Build())
95 defer logger.Sync()
96
97 logger.Info("logger construction succeeded")
98
99
100 }
101
102 func Example_advancedConfiguration() {
103
104
105
106
107
108
109
110
111
112
113 highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
114 return lvl >= zapcore.ErrorLevel
115 })
116 lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
117 return lvl < zapcore.ErrorLevel
118 })
119
120
121
122
123
124
125 topicDebugging := zapcore.AddSync(io.Discard)
126 topicErrors := zapcore.AddSync(io.Discard)
127
128
129
130 consoleDebugging := zapcore.Lock(os.Stdout)
131 consoleErrors := zapcore.Lock(os.Stderr)
132
133
134
135 kafkaEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
136 consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
137
138
139
140 core := zapcore.NewTee(
141 zapcore.NewCore(kafkaEncoder, topicErrors, highPriority),
142 zapcore.NewCore(consoleEncoder, consoleErrors, highPriority),
143 zapcore.NewCore(kafkaEncoder, topicDebugging, lowPriority),
144 zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority),
145 )
146
147
148 logger := zap.New(core)
149 defer logger.Sync()
150 logger.Info("constructed a logger")
151 }
152
153 func ExampleNamespace() {
154 logger := zap.NewExample()
155 defer logger.Sync()
156
157 logger.With(
158 zap.Namespace("metrics"),
159 zap.Int("counter", 1),
160 ).Info("tracked some metrics")
161
162
163 }
164
165 type addr struct {
166 IP string
167 Port int
168 }
169
170 type request struct {
171 URL string
172 Listen addr
173 Remote addr
174 }
175
176 func (a addr) MarshalLogObject(enc zapcore.ObjectEncoder) error {
177 enc.AddString("ip", a.IP)
178 enc.AddInt("port", a.Port)
179 return nil
180 }
181
182 func (r *request) MarshalLogObject(enc zapcore.ObjectEncoder) error {
183 enc.AddString("url", r.URL)
184 zap.Inline(r.Listen).AddTo(enc)
185 return enc.AddObject("remote", r.Remote)
186 }
187
188 func ExampleObject() {
189 logger := zap.NewExample()
190 defer logger.Sync()
191
192 req := &request{
193 URL: "/test",
194 Listen: addr{"127.0.0.1", 8080},
195 Remote: addr{"127.0.0.1", 31200},
196 }
197 logger.Info("new request, in nested object", zap.Object("req", req))
198 logger.Info("new request, inline", zap.Inline(req))
199
200
201
202 }
203
204 func ExampleNewStdLog() {
205 logger := zap.NewExample()
206 defer logger.Sync()
207
208 std := zap.NewStdLog(logger)
209 std.Print("standard logger wrapper")
210
211
212 }
213
214 func ExampleRedirectStdLog() {
215 logger := zap.NewExample()
216 defer logger.Sync()
217
218 undo := zap.RedirectStdLog(logger)
219 defer undo()
220
221 log.Print("redirected standard library")
222
223
224 }
225
226 func ExampleReplaceGlobals() {
227 logger := zap.NewExample()
228 defer logger.Sync()
229
230 undo := zap.ReplaceGlobals(logger)
231 defer undo()
232
233 zap.L().Info("replaced zap's global loggers")
234
235
236 }
237
238 func ExampleAtomicLevel() {
239 atom := zap.NewAtomicLevel()
240
241
242 encoderCfg := zap.NewProductionEncoderConfig()
243 encoderCfg.TimeKey = ""
244
245 logger := zap.New(zapcore.NewCore(
246 zapcore.NewJSONEncoder(encoderCfg),
247 zapcore.Lock(os.Stdout),
248 atom,
249 ))
250 defer logger.Sync()
251
252 logger.Info("info logging enabled")
253
254 atom.SetLevel(zap.ErrorLevel)
255 logger.Info("info logging disabled")
256
257
258 }
259
260 func ExampleAtomicLevel_config() {
261
262
263 rawJSON := []byte(`{
264 "level": "info",
265 "outputPaths": ["stdout"],
266 "errorOutputPaths": ["stderr"],
267 "encoding": "json",
268 "encoderConfig": {
269 "messageKey": "message",
270 "levelKey": "level",
271 "levelEncoder": "lowercase"
272 }
273 }`)
274 var cfg zap.Config
275 if err := json.Unmarshal(rawJSON, &cfg); err != nil {
276 panic(err)
277 }
278 logger := zap.Must(cfg.Build())
279 defer logger.Sync()
280
281 logger.Info("info logging enabled")
282
283 cfg.Level.SetLevel(zap.ErrorLevel)
284 logger.Info("info logging disabled")
285
286
287 }
288
289 func ExampleLogger_Check() {
290 logger := zap.NewExample()
291 defer logger.Sync()
292
293 if ce := logger.Check(zap.DebugLevel, "debugging"); ce != nil {
294
295
296
297 ce.Write(
298 zap.String("foo", "bar"),
299 zap.String("baz", "quux"),
300 )
301 }
302
303
304
305 }
306
307 func ExampleLogger_Named() {
308 logger := zap.NewExample()
309 defer logger.Sync()
310
311
312 logger.Info("no name")
313
314
315 main := logger.Named("main")
316 main.Info("main logger")
317
318
319 main.Named("subpackage").Info("sub-logger")
320
321
322
323
324 }
325
326 func ExampleWrapCore_replace() {
327
328
329 nop := zap.WrapCore(func(zapcore.Core) zapcore.Core {
330 return zapcore.NewNopCore()
331 })
332
333 logger := zap.NewExample()
334 defer logger.Sync()
335
336 logger.Info("working")
337 logger.WithOptions(nop).Info("no-op")
338 logger.Info("original logger still works")
339
340
341
342 }
343
344 func ExampleWrapCore_wrap() {
345
346
347 doubled := zap.WrapCore(func(c zapcore.Core) zapcore.Core {
348 return zapcore.NewTee(c, c)
349 })
350
351 logger := zap.NewExample()
352 defer logger.Sync()
353
354 logger.Info("single")
355 logger.WithOptions(doubled).Info("doubled")
356
357
358
359
360 }
361
362 func ExampleDict() {
363 logger := zap.NewExample()
364 defer logger.Sync()
365
366 logger.Info("login event",
367 zap.Dict("event",
368 zap.Int("id", 123),
369 zap.String("name", "jane"),
370 zap.String("status", "pending")))
371
372
373 }
374
375 func ExampleObjects() {
376 logger := zap.NewExample()
377 defer logger.Sync()
378
379
380
381 logger.Debug("opening connections",
382 zap.Objects("addrs", []addr{
383 {IP: "123.45.67.89", Port: 4040},
384 {IP: "127.0.0.1", Port: 4041},
385 {IP: "192.168.0.1", Port: 4042},
386 }))
387
388
389 }
390
391 func ExampleObjectValues() {
392 logger := zap.NewExample()
393 defer logger.Sync()
394
395
396
397
398 logger.Debug("starting tunnels",
399 zap.ObjectValues("addrs", []request{
400 {
401 URL: "/foo",
402 Listen: addr{"127.0.0.1", 8080},
403 Remote: addr{"123.45.67.89", 4040},
404 },
405 {
406 URL: "/bar",
407 Listen: addr{"127.0.0.1", 8080},
408 Remote: addr{"127.0.0.1", 31200},
409 },
410 }))
411
412
413 }
414
View as plain text