-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathzzap.go
77 lines (61 loc) · 1.66 KB
/
zzap.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
76
77
// Package zzap provides zpage observer for "go.uber.org/zap" logger.
package zzap
import (
"github.com/bool64/logz"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type obCore struct {
observers []*logz.Observer
encoder zapcore.Encoder
fields []zapcore.Field
zapcore.Core
}
type entry struct {
encoder zapcore.Encoder
msg zapcore.Entry
fields []zapcore.Field
}
func (e entry) MarshalJSON() ([]byte, error) {
b, err := e.encoder.EncodeEntry(e.msg, e.fields)
if err != nil {
return nil, err
}
return b.Bytes(), nil
}
func (c obCore) With(fields []zapcore.Field) zapcore.Core {
if len(fields) == 0 {
return c
}
c.Core = c.Core.With(fields)
c.fields = append(c.fields[0:len(c.fields):len(c.fields)], fields...)
return c
}
func (c obCore) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry {
return c.Core.Check(entry, checkedEntry.AddCore(entry, c))
}
func (c obCore) Write(msg zapcore.Entry, fields []zapcore.Field) error {
c.observers[msg.Level+1].ObserveMessage(msg.Message, entry{
encoder: c.encoder,
msg: msg,
fields: append(fields, c.fields...),
})
return nil
}
// NewOption creates zap option with per-level observers.
func NewOption(cfg logz.Config) (zap.Option, []*logz.Observer) {
var observers []*logz.Observer
for i := zapcore.DebugLevel; i <= zapcore.FatalLevel; i++ {
cfg.Name = i.CapitalString()
observers = append(observers, &logz.Observer{
Config: cfg,
})
}
return zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return obCore{
observers: observers,
encoder: zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
Core: core,
}
}), observers
}