/
logger.go
98 lines (79 loc) · 2.19 KB
/
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package logger
import (
"io"
"github.com/borderzero/border0-cli/internal/connector_v2/errors"
pb "github.com/borderzero/border0-proto/connector"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"google.golang.org/protobuf/types/known/timestamppb"
)
type connectorLogger struct {
logger *zap.Logger
sendFunc func(*pb.ControlStreamRequest) error
encoder zapcore.Encoder
level zapcore.Level
fields []zapcore.Field
pluginID string
socketID string
}
func NewConnectorLogger(l *zap.Logger, sendFunc func(*pb.ControlStreamRequest) error) *zap.Logger {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.LevelKey = ""
encoderConfig.TimeKey = ""
encoder := zapcore.NewJSONEncoder(encoderConfig)
core := &connectorLogger{
logger: l,
encoder: encoder,
level: l.Level(),
sendFunc: sendFunc,
}
return zap.New(core)
}
func (c *connectorLogger) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry {
if c.Enabled(entry.Level) {
return checkedEntry.AddCore(entry, c)
}
return checkedEntry
}
func (c *connectorLogger) Sync() error {
return nil
}
func (c *connectorLogger) With(fields []zapcore.Field) zapcore.Core {
cloned := *c
cloned.fields = append(cloned.fields, fields...)
for _, field := range fields {
switch field.Key {
case "plugin_id":
cloned.pluginID = field.String
case "socket_id":
cloned.socketID = field.String
}
}
return &cloned
}
func (c *connectorLogger) Enabled(level zapcore.Level) bool {
return true
}
func (c *connectorLogger) Write(entry zapcore.Entry, fields []zapcore.Field) error {
allFields := append(c.fields, fields...)
c.logger.Log(entry.Level, entry.Message, allFields...)
buffer, err := c.encoder.EncodeEntry(entry, allFields)
if err != nil {
return err
}
err = c.sendFunc(&pb.ControlStreamRequest{
RequestType: &pb.ControlStreamRequest_Log{
Log: &pb.Log{
Timestamp: timestamppb.Now(),
Severity: entry.Level.String(),
Message: string(buffer.Bytes()),
PluginId: c.pluginID,
SocketId: c.socketID,
},
},
})
if err != nil && err.Error() != errors.ErrStreamNotConnected && err != io.EOF {
c.logger.Error("failed to send log", zap.Error(err))
}
return nil
}