Skip to content

Commit d672391

Browse files
authored
Use log severity and verbosity level (#1340)
- All logs use 1 severity level instead of printf - All transport logs only go to verbose level 2+ - The default logger only log errors and verbosity level 1 - Add environment variable GRPC_GO_LOG_SEVERITY_LEVEL and GRPC_GO_LOG_VERBOSITY_LEVEL to set severity or verbosity levels for the default logger
1 parent 27b2052 commit d672391

12 files changed

+156
-78
lines changed

balancer.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ type roundRobin struct {
157157
func (rr *roundRobin) watchAddrUpdates() error {
158158
updates, err := rr.w.Next()
159159
if err != nil {
160-
grpclog.Printf("grpc: the naming watcher stops working due to %v.\n", err)
160+
grpclog.Warningf("grpc: the naming watcher stops working due to %v.", err)
161161
return err
162162
}
163163
rr.mu.Lock()
@@ -173,7 +173,7 @@ func (rr *roundRobin) watchAddrUpdates() error {
173173
for _, v := range rr.addrs {
174174
if addr == v.addr {
175175
exist = true
176-
grpclog.Println("grpc: The name resolver wanted to add an existing address: ", addr)
176+
grpclog.Infoln("grpc: The name resolver wanted to add an existing address: ", addr)
177177
break
178178
}
179179
}
@@ -190,7 +190,7 @@ func (rr *roundRobin) watchAddrUpdates() error {
190190
}
191191
}
192192
default:
193-
grpclog.Println("Unknown update.Op ", update.Op)
193+
grpclog.Errorln("Unknown update.Op ", update.Op)
194194
}
195195
}
196196
// Make a copy of rr.addrs and write it onto rr.addrCh so that gRPC internals gets notified.

clientconn.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ func (cc *ClientConn) resetAddrConn(addr Address, block bool, tearDownErr error)
632632
// Start a goroutine connecting to the server asynchronously.
633633
go func() {
634634
if err := ac.resetTransport(false); err != nil {
635-
grpclog.Printf("Failed to dial %s: %v; please retry.", ac.addr.Addr, err)
635+
grpclog.Warningln("Failed to dial %s: %v; please retry.", ac.addr.Addr, err)
636636
if err != errConnClosing {
637637
// Keep this ac in cc.conns, to get the reason it's torn down.
638638
ac.tearDown(err)
@@ -868,7 +868,7 @@ func (ac *addrConn) resetTransport(closeTransport bool) error {
868868
if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() {
869869
return err
870870
}
871-
grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %v", err, ac.addr)
871+
grpclog.Warningf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %v", err, ac.addr)
872872
ac.mu.Lock()
873873
if ac.state == Shutdown {
874874
// ac.tearDown(...) has been invoked.
@@ -973,7 +973,7 @@ func (ac *addrConn) transportMonitor() {
973973
ac.mu.Lock()
974974
ac.printf("transport exiting: %v", err)
975975
ac.mu.Unlock()
976-
grpclog.Printf("grpc: addrConn.transportMonitor exits due to: %v", err)
976+
grpclog.Warningf("grpc: addrConn.transportMonitor exits due to: %v", err)
977977
if err != errConnClosing {
978978
// Keep this ac in cc.conns, to get the reason it's torn down.
979979
ac.tearDown(err)

grpclb.go

+16-16
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ type balancer struct {
137137
func (b *balancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerInfo) error {
138138
updates, err := w.Next()
139139
if err != nil {
140-
grpclog.Printf("grpclb: failed to get next addr update from watcher: %v", err)
140+
grpclog.Warningf("grpclb: failed to get next addr update from watcher: %v", err)
141141
return err
142142
}
143143
b.mu.Lock()
@@ -162,21 +162,21 @@ func (b *balancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerIn
162162
md, ok := update.Metadata.(*AddrMetadataGRPCLB)
163163
if !ok {
164164
// TODO: Revisit the handling here and may introduce some fallback mechanism.
165-
grpclog.Printf("The name resolution contains unexpected metadata %v", update.Metadata)
165+
grpclog.Errorf("The name resolution contains unexpected metadata %v", update.Metadata)
166166
continue
167167
}
168168
switch md.AddrType {
169169
case Backend:
170170
// TODO: Revisit the handling here and may introduce some fallback mechanism.
171-
grpclog.Printf("The name resolution does not give grpclb addresses")
171+
grpclog.Errorf("The name resolution does not give grpclb addresses")
172172
continue
173173
case GRPCLB:
174174
b.rbs = append(b.rbs, remoteBalancerInfo{
175175
addr: update.Addr,
176176
name: md.ServerName,
177177
})
178178
default:
179-
grpclog.Printf("Received unknow address type %d", md.AddrType)
179+
grpclog.Errorf("Received unknow address type %d", md.AddrType)
180180
continue
181181
}
182182
case naming.Delete:
@@ -188,7 +188,7 @@ func (b *balancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerIn
188188
}
189189
}
190190
default:
191-
grpclog.Println("Unknown update.Op ", update.Op)
191+
grpclog.Errorf("Unknown update.Op %v", update.Op)
192192
}
193193
}
194194
// TODO: Fall back to the basic round-robin load balancing if the resulting address is
@@ -299,7 +299,7 @@ func (b *balancer) sendLoadReport(s *balanceLoadClientStream, interval time.Dura
299299
ClientStats: &stats,
300300
},
301301
}); err != nil {
302-
grpclog.Printf("grpclb: failed to send load report: %v", err)
302+
grpclog.Errorf("grpclb: failed to send load report: %v", err)
303303
return
304304
}
305305
}
@@ -310,7 +310,7 @@ func (b *balancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry b
310310
defer cancel()
311311
stream, err := lbc.BalanceLoad(ctx)
312312
if err != nil {
313-
grpclog.Printf("grpclb: failed to perform RPC to the remote balancer %v", err)
313+
grpclog.Errorf("grpclb: failed to perform RPC to the remote balancer %v", err)
314314
return
315315
}
316316
b.mu.Lock()
@@ -327,25 +327,25 @@ func (b *balancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry b
327327
},
328328
}
329329
if err := stream.Send(initReq); err != nil {
330-
grpclog.Printf("grpclb: failed to send init request: %v", err)
330+
grpclog.Errorf("grpclb: failed to send init request: %v", err)
331331
// TODO: backoff on retry?
332332
return true
333333
}
334334
reply, err := stream.Recv()
335335
if err != nil {
336-
grpclog.Printf("grpclb: failed to recv init response: %v", err)
336+
grpclog.Errorf("grpclb: failed to recv init response: %v", err)
337337
// TODO: backoff on retry?
338338
return true
339339
}
340340
initResp := reply.GetInitialResponse()
341341
if initResp == nil {
342-
grpclog.Println("grpclb: reply from remote balancer did not include initial response.")
342+
grpclog.Errorf("grpclb: reply from remote balancer did not include initial response.")
343343
return
344344
}
345345
// TODO: Support delegation.
346346
if initResp.LoadBalancerDelegate != "" {
347347
// delegation
348-
grpclog.Println("TODO: Delegation is not supported yet.")
348+
grpclog.Errorf("TODO: Delegation is not supported yet.")
349349
return
350350
}
351351
streamDone := make(chan struct{})
@@ -360,7 +360,7 @@ func (b *balancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry b
360360
for {
361361
reply, err := stream.Recv()
362362
if err != nil {
363-
grpclog.Printf("grpclb: failed to recv server list: %v", err)
363+
grpclog.Errorf("grpclb: failed to recv server list: %v", err)
364364
break
365365
}
366366
b.mu.Lock()
@@ -394,7 +394,7 @@ func (b *balancer) Start(target string, config BalancerConfig) error {
394394
w, err := b.r.Resolve(target)
395395
if err != nil {
396396
b.mu.Unlock()
397-
grpclog.Printf("grpclb: failed to resolve address: %v, err: %v", target, err)
397+
grpclog.Errorf("grpclb: failed to resolve address: %v, err: %v", target, err)
398398
return err
399399
}
400400
b.w = w
@@ -404,7 +404,7 @@ func (b *balancer) Start(target string, config BalancerConfig) error {
404404
go func() {
405405
for {
406406
if err := b.watchAddrUpdates(w, balancerAddrsCh); err != nil {
407-
grpclog.Printf("grpclb: the naming watcher stops working due to %v.\n", err)
407+
grpclog.Warningf("grpclb: the naming watcher stops working due to %v.\n", err)
408408
close(balancerAddrsCh)
409409
return
410410
}
@@ -495,7 +495,7 @@ func (b *balancer) Start(target string, config BalancerConfig) error {
495495
if creds := config.DialCreds; creds != nil {
496496
if rb.name != "" {
497497
if err := creds.OverrideServerName(rb.name); err != nil {
498-
grpclog.Printf("grpclb: failed to override the server name in the credentials: %v", err)
498+
grpclog.Warningf("grpclb: failed to override the server name in the credentials: %v", err)
499499
continue
500500
}
501501
}
@@ -510,7 +510,7 @@ func (b *balancer) Start(target string, config BalancerConfig) error {
510510
ccError = make(chan struct{})
511511
cc, err = Dial(rb.addr, dopts...)
512512
if err != nil {
513-
grpclog.Printf("grpclb: failed to setup a connection to the remote balancer %v: %v", rb.addr, err)
513+
grpclog.Warningf("grpclb: failed to setup a connection to the remote balancer %v: %v", rb.addr, err)
514514
close(ccError)
515515
continue
516516
}

grpclog/glogger/glogger.go

+14-12
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
package glogger
2222

2323
import (
24+
"fmt"
25+
2426
"github.com/golang/glog"
2527
"google.golang.org/grpc/grpclog"
2628
)
@@ -32,51 +34,51 @@ func init() {
3234
type glogger struct{}
3335

3436
func (g *glogger) Info(args ...interface{}) {
35-
glog.Info(args...)
37+
glog.InfoDepth(2, args...)
3638
}
3739

3840
func (g *glogger) Infoln(args ...interface{}) {
39-
glog.Infoln(args...)
41+
glog.InfoDepth(2, fmt.Sprintln(args...))
4042
}
4143

4244
func (g *glogger) Infof(format string, args ...interface{}) {
43-
glog.Infof(format, args...)
45+
glog.InfoDepth(2, fmt.Sprintf(format, args...))
4446
}
4547

4648
func (g *glogger) Warning(args ...interface{}) {
47-
glog.Warning(args...)
49+
glog.WarningDepth(2, args...)
4850
}
4951

5052
func (g *glogger) Warningln(args ...interface{}) {
51-
glog.Warningln(args...)
53+
glog.WarningDepth(2, fmt.Sprintln(args...))
5254
}
5355

5456
func (g *glogger) Warningf(format string, args ...interface{}) {
55-
glog.Warningf(format, args...)
57+
glog.WarningDepth(2, fmt.Sprintf(format, args...))
5658
}
5759

5860
func (g *glogger) Error(args ...interface{}) {
59-
glog.Error(args...)
61+
glog.ErrorDepth(2, args...)
6062
}
6163

6264
func (g *glogger) Errorln(args ...interface{}) {
63-
glog.Errorln(args...)
65+
glog.ErrorDepth(2, fmt.Sprintln(args...))
6466
}
6567

6668
func (g *glogger) Errorf(format string, args ...interface{}) {
67-
glog.Errorf(format, args...)
69+
glog.ErrorDepth(2, fmt.Sprintf(format, args...))
6870
}
6971

7072
func (g *glogger) Fatal(args ...interface{}) {
71-
glog.Fatal(args...)
73+
glog.FatalDepth(2, args...)
7274
}
7375

7476
func (g *glogger) Fatalln(args ...interface{}) {
75-
glog.Fatalln(args...)
77+
glog.FatalDepth(2, fmt.Sprintln(args...))
7678
}
7779

7880
func (g *glogger) Fatalf(format string, args ...interface{}) {
79-
glog.Fatalf(format, args...)
81+
glog.FatalDepth(2, fmt.Sprintf(format, args...))
8082
}
8183

8284
func (g *glogger) V(l int) bool {

grpclog/grpclog.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,15 @@
3131
*
3232
*/
3333

34-
package grpclog
34+
// Package grpclog defines logging for grpc.
35+
//
36+
// All logs in transport package only go to verbose level 2.
37+
// All logs in other packages in grpc are logged in spite of the verbosity level.
38+
//
39+
// In the default logger,
40+
// severity level can be set by environment variable GRPC_GO_LOG_SEVERITY_LEVEL,
41+
// verbosity level can be set by GRPC_GO_LOG_VERBOSITY_LEVEL.
42+
package grpclog // import "google.golang.org/grpc/grpclog"
3543

3644
import "os"
3745

grpclog/logger.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
*
1717
*/
1818

19-
// Package grpclog defines logging for grpc.
20-
package grpclog // import "google.golang.org/grpc/grpclog"
19+
package grpclog
2120

2221
// Logger mimics golang's standard Logger as an interface.
2322
// Deprecated: use LoggerV2.

grpclog/loggerv2.go

+31-9
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,14 @@
3131
*
3232
*/
3333

34-
/*
35-
Package grpclog defines logging for grpc.
36-
*/
37-
package grpclog // import "google.golang.org/grpc/grpclog"
34+
package grpclog
3835

3936
import (
4037
"io"
4138
"io/ioutil"
4239
"log"
4340
"os"
41+
"strconv"
4442
)
4543

4644
// LoggerV2 does underlying logging work for grpclog.
@@ -104,6 +102,7 @@ var severityName = []string{
104102
// loggerT is the default logger used by grpclog.
105103
type loggerT struct {
106104
m []*log.Logger
105+
v int
107106
}
108107

109108
// NewLoggerV2 creates a loggerV2 with the provided writers.
@@ -112,19 +111,44 @@ type loggerT struct {
112111
// Warning logs will be written to warningW and infoW.
113112
// Info logs will be written to infoW.
114113
func NewLoggerV2(infoW, warningW, errorW io.Writer) LoggerV2 {
114+
return NewLoggerV2WithVerbosity(infoW, warningW, errorW, 0)
115+
}
116+
117+
// NewLoggerV2WithVerbosity creates a loggerV2 with the provided writers and
118+
// verbosity level.
119+
func NewLoggerV2WithVerbosity(infoW, warningW, errorW io.Writer, v int) LoggerV2 {
115120
var m []*log.Logger
116121
m = append(m, log.New(infoW, severityName[infoLog]+": ", log.LstdFlags))
117122
m = append(m, log.New(io.MultiWriter(infoW, warningW), severityName[warningLog]+": ", log.LstdFlags))
118123
ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal.
119124
m = append(m, log.New(ew, severityName[errorLog]+": ", log.LstdFlags))
120125
m = append(m, log.New(ew, severityName[fatalLog]+": ", log.LstdFlags))
121-
return &loggerT{m: m}
126+
return &loggerT{m: m, v: v}
122127
}
123128

124129
// newLoggerV2 creates a loggerV2 to be used as default logger.
125130
// All logs are written to stderr.
126131
func newLoggerV2() LoggerV2 {
127-
return NewLoggerV2(os.Stderr, ioutil.Discard, ioutil.Discard)
132+
errorW := ioutil.Discard
133+
warningW := ioutil.Discard
134+
infoW := ioutil.Discard
135+
136+
logLevel := os.Getenv("GRPC_GO_LOG_SEVERITY_LEVEL")
137+
switch logLevel {
138+
case "", "ERROR", "error": // If env is unset, set level to ERROR.
139+
errorW = os.Stderr
140+
case "WARNING", "warning":
141+
warningW = os.Stderr
142+
case "INFO", "info":
143+
infoW = os.Stderr
144+
}
145+
146+
var v int
147+
vLevel := os.Getenv("GRPC_GO_LOG_VERBOSITY_LEVEL")
148+
if vl, err := strconv.Atoi(vLevel); err == nil {
149+
v = vl
150+
}
151+
return NewLoggerV2WithVerbosity(infoW, warningW, errorW, v)
128152
}
129153

130154
func (g *loggerT) Info(args ...interface{}) {
@@ -176,7 +200,5 @@ func (g *loggerT) Fatalf(format string, args ...interface{}) {
176200
}
177201

178202
func (g *loggerT) V(l int) bool {
179-
// Returns true for all verbose level.
180-
// TODO support verbose level in the default logger.
181-
return true
203+
return l <= g.v
182204
}

0 commit comments

Comments
 (0)