-
Notifications
You must be signed in to change notification settings - Fork 0
/
log.go
95 lines (83 loc) · 2.03 KB
/
log.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
package log
import (
"context"
"log/slog"
"os"
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
"google.golang.org/grpc"
)
type Logger struct {
c Config
*slog.Logger
}
func New(c Config) *Logger {
lvl := slog.LevelInfo
if c.Debug {
lvl = slog.LevelDebug
}
opts := &slog.HandlerOptions{
Level: lvl,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
switch a.Key {
case "protocol", "grpc.start_time", "peer.address":
return slog.Attr{}
case "grpc.method":
a.Key = "method"
case "grpc.code":
a.Key = "status"
case "grpc.time_ms":
return slog.String("responseTime", a.Value.String()+"ms")
case "grpc.request.deadline":
a.Key = "requestDeadline"
case "grpc.error":
a.Key = "error"
}
return a
},
}
logger := slog.New(slog.NewTextHandler(os.Stdout, opts))
if c.UseJSON {
logger = slog.New(slog.NewJSONHandler(os.Stdout, opts))
}
return &Logger{
Logger: logger,
c: c,
}
}
func (l Logger) NewUnaryInterceptor() grpc.UnaryServerInterceptor {
ev := []logging.LoggableEvent{logging.FinishCall}
if l.c.Debug {
ev = append(ev, logging.PayloadReceived, logging.PayloadSent)
}
return logging.UnaryServerInterceptor(
l.gRPCLogger(),
logging.WithLogOnEvents(ev...),
logging.WithDisableLoggingFields(
logging.ServiceFieldKey, logging.MethodTypeFieldKey,
logging.ComponentFieldKey,
),
)
}
func (l Logger) NewStreamInterceptor() grpc.StreamServerInterceptor {
ev := []logging.LoggableEvent{logging.StartCall, logging.FinishCall}
if l.c.Debug {
ev = append(ev, logging.PayloadReceived, logging.PayloadSent)
}
return logging.StreamServerInterceptor(
l.gRPCLogger(),
logging.WithLogOnEvents(ev...),
logging.WithDisableLoggingFields(
logging.ServiceFieldKey, logging.MethodTypeFieldKey,
logging.ComponentFieldKey,
),
)
}
func (l Logger) gRPCLogger() logging.LoggerFunc {
return logging.LoggerFunc(func(
ctx context.Context,
lvl logging.Level,
msg string,
fields ...any) {
l.Log(ctx, slog.Level(lvl), msg, fields...)
})
}