...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package logging
19
20 import (
21 "log"
22 "os"
23
24 "go.uber.org/zap"
25 "go.uber.org/zap/zapcore"
26 )
27
28
29
30 var Verbosef = log.Printf
31
32
33 var Infof = log.Printf
34
35
36 var Errorf = log.Printf
37
38
39 func LogDebugToStdout() {
40 logger := log.New(os.Stdout, "", log.LstdFlags)
41 Verbosef = logger.Printf
42 Infof = logger.Printf
43 }
44
45 func noop(string, ...interface{}) {}
46
47
48 func LogVerboseToNowhere() {
49 Verbosef = noop
50 }
51
52
53 func DisableLogging() {
54 Verbosef = noop
55 Infof = noop
56 Errorf = noop
57 }
58
59
60
61 func EnableStructuredLogs(logDebugStdout, verbose bool) (func(), error) {
62
63
64
65
66 highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
67 return lvl >= zapcore.ErrorLevel
68 })
69 lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
70 return lvl < zapcore.ErrorLevel
71 })
72
73
74
75 consoleErrors := zapcore.Lock(os.Stderr)
76 consoleDebugging := consoleErrors
77 if logDebugStdout {
78 consoleDebugging = zapcore.Lock(os.Stdout)
79 }
80
81 config := zap.NewProductionEncoderConfig()
82 config.LevelKey = "severity"
83 config.MessageKey = "message"
84 config.TimeKey = "timestamp"
85 config.EncodeLevel = zapcore.CapitalLevelEncoder
86 config.EncodeTime = zapcore.ISO8601TimeEncoder
87 consoleEncoder := zapcore.NewJSONEncoder(config)
88 core := zapcore.NewTee(
89 zapcore.NewCore(consoleEncoder, consoleErrors, highPriority),
90 zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority),
91 )
92
93 logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
94
95 sugar := logger.Sugar()
96 Verbosef = sugar.Infof
97 if !verbose {
98 Verbosef = noop
99 }
100 Infof = sugar.Infof
101 Errorf = sugar.Errorf
102
103 return func() {
104 logger.Sync()
105 }, nil
106 }
107
View as plain text