12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
- // Package log defines standardized ways to initialize Go kit loggers.
16
- // It should typically only ever be imported by main packages.
17
15
package log
18
16
19
17
import (
@@ -40,6 +38,10 @@ var timestampFormat = log.TimestampFormat(
40
38
"2006-01-02T15:04:05.000Z07:00" ,
41
39
)
42
40
41
+ type Logger interface {
42
+ Log (keyvals ... interface {}) error
43
+ }
44
+
43
45
// AllowedLevel is a settable identifier for the minimum level a log entry
44
46
// must be have.
45
47
type AllowedLevel struct {
@@ -121,15 +123,20 @@ type Config struct {
121
123
Format * AllowedFormat
122
124
}
123
125
126
+ type SimpleLogger struct {
127
+ Base log.Logger
128
+ Leveled log.Logger
129
+ }
130
+
124
131
// New returns a new leveled logger. Each logged line will be annotated
125
- // with a timestamp. The output always goes to stderr .
126
- func New (config * Config ) log. Logger {
132
+ // with a timestamp. The output always goes to stdout .
133
+ func New (config * Config ) * SimpleLogger {
127
134
var l log.Logger
128
135
129
136
if config .Format != nil && config .Format .s == jsonFormat {
130
- l = log .NewJSONLogger (log .NewSyncWriter (os .Stderr ))
137
+ l = log .NewJSONLogger (log .NewSyncWriter (os .Stdout ))
131
138
} else {
132
- l = log .NewLogfmtLogger (log .NewSyncWriter (os .Stderr ))
139
+ l = log .NewLogfmtLogger (log .NewSyncWriter (os .Stdout ))
133
140
}
134
141
135
142
if config .Level != nil {
@@ -139,22 +146,36 @@ func New(config *Config) log.Logger {
139
146
l = log .With (l , "ts" , timestampFormat , "caller" , log .DefaultCaller )
140
147
}
141
148
142
- return l
149
+ lo := & SimpleLogger {
150
+ Base : l ,
151
+ Leveled : l ,
152
+ }
153
+
154
+ return lo
155
+ }
156
+
157
+ // Log implements [log.Logger].
158
+ func (l * SimpleLogger ) Log (keyvals ... interface {}) error {
159
+ if err := l .Leveled .Log (keyvals ... ); err != nil {
160
+ return fmt .Errorf ("log error: %w" , err )
161
+ }
162
+
163
+ return nil
143
164
}
144
165
145
166
// NewDynamic returns a new leveled logger. Each logged line will be annotated
146
- // with a timestamp. The output always goes to stderr . Some properties can be
167
+ // with a timestamp. The output always goes to stdout . Some properties can be
147
168
// changed, like the level.
148
- func NewDynamic (config * Config ) * Logger {
169
+ func NewDynamic (config * Config ) * DynamicLogger {
149
170
var l log.Logger
150
171
151
172
if config .Format != nil && config .Format .s == jsonFormat {
152
- l = log .NewJSONLogger (log .NewSyncWriter (os .Stderr ))
173
+ l = log .NewJSONLogger (log .NewSyncWriter (os .Stdout ))
153
174
} else {
154
- l = log .NewLogfmtLogger (log .NewSyncWriter (os .Stderr ))
175
+ l = log .NewLogfmtLogger (log .NewSyncWriter (os .Stdout ))
155
176
}
156
177
157
- lo := & Logger {
178
+ lo := & DynamicLogger {
158
179
Base : l ,
159
180
Leveled : l ,
160
181
}
@@ -166,16 +187,16 @@ func NewDynamic(config *Config) *Logger {
166
187
return lo
167
188
}
168
189
169
- type Logger struct {
190
+ type DynamicLogger struct {
170
191
Base log.Logger
171
192
Leveled log.Logger
172
193
CurrentLevel * AllowedLevel
173
194
174
195
mtx sync.Mutex
175
196
}
176
197
177
- // Log implements logger.Log .
178
- func (l * Logger ) Log (keyvals ... interface {}) error {
198
+ // Log implements [log.Logger] .
199
+ func (l * DynamicLogger ) Log (keyvals ... interface {}) error {
179
200
l .mtx .Lock ()
180
201
defer l .mtx .Unlock ()
181
202
@@ -187,7 +208,7 @@ func (l *Logger) Log(keyvals ...interface{}) error {
187
208
}
188
209
189
210
// SetLevel changes the log level.
190
- func (l * Logger ) SetLevel (lvl * AllowedLevel ) {
211
+ func (l * DynamicLogger ) SetLevel (lvl * AllowedLevel ) {
191
212
l .mtx .Lock ()
192
213
defer l .mtx .Unlock ()
193
214
@@ -207,21 +228,36 @@ func (l *Logger) SetLevel(lvl *AllowedLevel) {
207
228
}
208
229
209
230
// Error returns a logger that includes a Key/ErrorValue pair.
210
- func Error (logger log. Logger ) log. Logger {
211
- return log . WithPrefix (logger , level .Key (), level .ErrorValue ())
231
+ func Error (logger Logger ) Logger {
232
+ return WithPrefix (logger , level .Key (), level .ErrorValue ())
212
233
}
213
234
214
235
// Warn returns a logger that includes a Key/WarnValue pair.
215
- func Warn (logger log. Logger ) log. Logger {
216
- return log . WithPrefix (logger , level .Key (), level .WarnValue ())
236
+ func Warn (logger Logger ) Logger {
237
+ return WithPrefix (logger , level .Key (), level .WarnValue ())
217
238
}
218
239
219
240
// Info returns a logger that includes a Key/InfoValue pair.
220
- func Info (logger log. Logger ) log. Logger {
221
- return log . WithPrefix (logger , level .Key (), level .InfoValue ())
241
+ func Info (logger Logger ) Logger {
242
+ return WithPrefix (logger , level .Key (), level .InfoValue ())
222
243
}
223
244
224
245
// Debug returns a logger that includes a Key/DebugValue pair.
225
- func Debug (logger log.Logger ) log.Logger {
226
- return log .WithPrefix (logger , level .Key (), level .DebugValue ())
246
+ func Debug (logger Logger ) Logger {
247
+ return WithPrefix (logger , level .Key (), level .DebugValue ())
248
+ }
249
+
250
+ // WithPrefix wraps [log.WithPrefix].
251
+ func WithPrefix (logger Logger , keyvals ... interface {}) Logger {
252
+ return log .WithPrefix (logger , keyvals ... )
253
+ }
254
+
255
+ // With wraps [log.With].
256
+ func With (logger Logger , keyvals ... interface {}) Logger {
257
+ return log .With (logger , keyvals ... )
258
+ }
259
+
260
+ // WithSuffix wraps [log.WithSuffix].
261
+ func WithSuffix (logger Logger , keyvals ... interface {}) Logger {
262
+ return log .WithSuffix (logger , keyvals ... )
227
263
}
0 commit comments