-
Notifications
You must be signed in to change notification settings - Fork 8
/
zerolog_logger.go
75 lines (61 loc) · 2.07 KB
/
zerolog_logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package logger
import (
"os"
"github.com/rs/zerolog"
)
// NewZeroLogger returns a new ZeroLogger
func NewZeroLogger() *ZeroLogger {
l := zerolog.New(os.Stderr).With().Timestamp().Logger()
l = l.Output(zerolog.ConsoleWriter{Out: os.Stderr})
return &ZeroLogger{Logger: l}
}
// Compile time assertion that our logger meets the intferface specifications
var _ GenericLogger = (*ZeroLogger)(nil)
var _ GenericContext = (*ZeroLogContext)(nil)
type field struct {
key string
val interface{}
}
// ZeroLogContext meets the interface type and provides context to a log event
type ZeroLogContext struct {
event *zerolog.Event
fields []field
}
// Field appends a field to the context
func (zlc *ZeroLogContext) Field(key string, val interface{}) GenericContext {
zlc.event = zlc.event.Interface(key, val)
zlc.fields = append(zlc.fields, field{key, val})
return zlc
}
// Log prints the compiled log
func (zlc *ZeroLogContext) Log(msg string) {
zlc.event.Msg(msg)
}
// ZeroLogger is a wrapper around zerolog so it can implement our interface
type ZeroLogger struct {
Logger zerolog.Logger
}
// Debug calls the debug method of the registered logger
func (zl *ZeroLogger) Debug() GenericContext {
return &ZeroLogContext{event: zl.Logger.Debug(), fields: make([]field, 0)}
}
// Info calls the info method of the registered logger
func (zl *ZeroLogger) Info() GenericContext {
return &ZeroLogContext{event: zl.Logger.Info(), fields: make([]field, 0)}
}
// Warn calls the warn method of the registered logger
func (zl *ZeroLogger) Warn() GenericContext {
return &ZeroLogContext{event: zl.Logger.Warn(), fields: make([]field, 0)}
}
// Error calls the error method of the registered logger
func (zl *ZeroLogger) Error() GenericContext {
return &ZeroLogContext{event: zl.Logger.Error(), fields: make([]field, 0)}
}
// With appends the context to a new logger and returns it
func (zl *ZeroLogger) With(gc GenericContext) GenericLogger {
ctx := zl.Logger.With()
for _, field := range gc.(*ZeroLogContext).fields {
ctx = ctx.Interface(field.key, field.val)
}
return &ZeroLogger{Logger: ctx.Logger()}
}