...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package zap
22
23 import (
24 "bytes"
25 "fmt"
26 "log"
27 "os"
28 "sync"
29
30 "go.uber.org/zap/zapcore"
31 )
32
33 const (
34 _stdLogDefaultDepth = 1
35 _loggerWriterDepth = 2
36 _programmerErrorTemplate = "You've found a bug in zap! Please file a bug at " +
37 "https://github.com/uber-go/zap/issues/new and reference this error: %v"
38 )
39
40 var (
41 _globalMu sync.RWMutex
42 _globalL = NewNop()
43 _globalS = _globalL.Sugar()
44 )
45
46
47
48 func L() *Logger {
49 _globalMu.RLock()
50 l := _globalL
51 _globalMu.RUnlock()
52 return l
53 }
54
55
56
57 func S() *SugaredLogger {
58 _globalMu.RLock()
59 s := _globalS
60 _globalMu.RUnlock()
61 return s
62 }
63
64
65
66 func ReplaceGlobals(logger *Logger) func() {
67 _globalMu.Lock()
68 prev := _globalL
69 _globalL = logger
70 _globalS = logger.Sugar()
71 _globalMu.Unlock()
72 return func() { ReplaceGlobals(prev) }
73 }
74
75
76
77
78 func NewStdLog(l *Logger) *log.Logger {
79 logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth))
80 f := logger.Info
81 return log.New(&loggerWriter{f}, "" , 0 )
82 }
83
84
85
86 func NewStdLogAt(l *Logger, level zapcore.Level) (*log.Logger, error) {
87 logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth))
88 logFunc, err := levelToFunc(logger, level)
89 if err != nil {
90 return nil, err
91 }
92 return log.New(&loggerWriter{logFunc}, "" , 0 ), nil
93 }
94
95
96
97
98
99
100
101
102 func RedirectStdLog(l *Logger) func() {
103 f, err := redirectStdLogAt(l, InfoLevel)
104 if err != nil {
105
106
107 panic(fmt.Sprintf(_programmerErrorTemplate, err))
108 }
109 return f
110 }
111
112
113
114
115
116
117
118
119 func RedirectStdLogAt(l *Logger, level zapcore.Level) (func(), error) {
120 return redirectStdLogAt(l, level)
121 }
122
123 func redirectStdLogAt(l *Logger, level zapcore.Level) (func(), error) {
124 flags := log.Flags()
125 prefix := log.Prefix()
126 log.SetFlags(0)
127 log.SetPrefix("")
128 logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth))
129 logFunc, err := levelToFunc(logger, level)
130 if err != nil {
131 return nil, err
132 }
133 log.SetOutput(&loggerWriter{logFunc})
134 return func() {
135 log.SetFlags(flags)
136 log.SetPrefix(prefix)
137 log.SetOutput(os.Stderr)
138 }, nil
139 }
140
141 func levelToFunc(logger *Logger, lvl zapcore.Level) (func(string, ...Field), error) {
142 switch lvl {
143 case DebugLevel:
144 return logger.Debug, nil
145 case InfoLevel:
146 return logger.Info, nil
147 case WarnLevel:
148 return logger.Warn, nil
149 case ErrorLevel:
150 return logger.Error, nil
151 case DPanicLevel:
152 return logger.DPanic, nil
153 case PanicLevel:
154 return logger.Panic, nil
155 case FatalLevel:
156 return logger.Fatal, nil
157 }
158 return nil, fmt.Errorf("unrecognized level: %q", lvl)
159 }
160
161 type loggerWriter struct {
162 logFunc func(msg string, fields ...Field)
163 }
164
165 func (l *loggerWriter) Write(p []byte) (int, error) {
166 p = bytes.TrimSpace(p)
167 l.logFunc(string(p))
168 return len(p), nil
169 }
170
View as plain text