@@ -21,21 +21,27 @@ import (
21
21
"fmt"
22
22
"os"
23
23
"strings"
24
+ "sync/atomic"
24
25
25
26
"google.golang.org/grpc"
26
27
)
27
28
28
29
var debugStdOut = os .Stdout
30
+ var debugSeq uint32
29
31
30
- func log (isRequest bool , msg interface {}) {
31
- j , _ := json .MarshalIndent (msg , "| " , " " )
32
- inOut := map [bool ]string {true : "REQ: " , false : "RESP: " }
33
- fmt .Fprintln (debugStdOut , "| " + inOut [isRequest ]+ string (j ))
32
+ func log (isRequest bool , seq uint32 , msg interface {}) {
33
+ prefix := fmt .Sprint (seq , " | " )
34
+ j , _ := json .MarshalIndent (msg , prefix , " " )
35
+ inOut := "RESP: "
36
+ if isRequest {
37
+ inOut = "REQ: "
38
+ }
39
+ fmt .Fprintln (debugStdOut , prefix + inOut + string (j ))
34
40
}
35
41
36
- func logError (err error ) {
42
+ func logError (seq uint32 , err error ) {
37
43
if err != nil {
38
- fmt .Fprintln (debugStdOut , "| ERROR: " , err )
44
+ fmt .Fprintln (debugStdOut , seq , "| ERROR: " , err )
39
45
}
40
46
}
41
47
@@ -55,11 +61,13 @@ func unaryLoggerInterceptor(ctx context.Context, req interface{}, info *grpc.Una
55
61
if ! logSelector (info .FullMethod ) {
56
62
return handler (ctx , req )
57
63
}
58
- fmt .Fprintln (debugStdOut , "CALLED:" , info .FullMethod )
59
- log (true , req )
64
+ seq := atomic .AddUint32 (& debugSeq , 1 )
65
+ fmt .Fprintln (debugStdOut , seq , "CALLED:" , info .FullMethod )
66
+ log (true , seq , req )
60
67
resp , err := handler (ctx , req )
61
- logError (err )
62
- log (false , resp )
68
+ logError (seq , err )
69
+ log (false , seq , resp )
70
+ fmt .Fprintln (debugStdOut , seq , "CALL END" )
63
71
fmt .Fprintln (debugStdOut )
64
72
return resp , err
65
73
}
@@ -68,35 +76,37 @@ func streamLoggerInterceptor(srv interface{}, stream grpc.ServerStream, info *gr
68
76
if ! logSelector (info .FullMethod ) {
69
77
return handler (srv , stream )
70
78
}
79
+ seq := atomic .AddUint32 (& debugSeq , 1 )
71
80
streamReq := ""
72
81
if info .IsClientStream {
73
82
streamReq = "STREAM_REQ "
74
83
}
75
84
if info .IsServerStream {
76
85
streamReq += "STREAM_RESP"
77
86
}
78
- fmt .Fprintln (debugStdOut , "CALLED:" , info .FullMethod , streamReq )
79
- err := handler (srv , & loggingServerStream {ServerStream : stream })
80
- logError (err )
81
- fmt .Fprintln (debugStdOut , "STREAM CLOSED" )
87
+ fmt .Fprintln (debugStdOut , seq , "CALLED:" , info .FullMethod , streamReq )
88
+ err := handler (srv , & loggingServerStream {ServerStream : stream , seq : seq })
89
+ logError (seq , err )
90
+ fmt .Fprintln (debugStdOut , seq , "STREAM CLOSED" )
82
91
fmt .Fprintln (debugStdOut )
83
92
return err
84
93
}
85
94
86
95
type loggingServerStream struct {
87
96
grpc.ServerStream
97
+ seq uint32
88
98
}
89
99
90
100
func (l * loggingServerStream ) RecvMsg (m interface {}) error {
91
101
err := l .ServerStream .RecvMsg (m )
92
- logError (err )
93
- log (true , m )
102
+ logError (l . seq , err )
103
+ log (true , l . seq , m )
94
104
return err
95
105
}
96
106
97
107
func (l * loggingServerStream ) SendMsg (m interface {}) error {
98
108
err := l .ServerStream .SendMsg (m )
99
- logError (err )
100
- log (false , m )
109
+ logError (l . seq , err )
110
+ log (false , l . seq , m )
101
111
return err
102
112
}
0 commit comments