Skip to content

Commit 116bbed

Browse files
committed
address PR feedback
1 parent 14e7a0c commit 116bbed

File tree

6 files changed

+68
-34
lines changed

6 files changed

+68
-34
lines changed

cluster.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,7 @@ type ClusterConfig struct {
261261

262262
// StructuredLogger for this ClusterConfig.
263263
//
264-
// You can change the log level of the default logger by creating a new logger using gocql.NewLogger and providing it here.
265-
//
266-
//There are 3 built in implementations of StructuredLogger:
264+
// There are 3 built in implementations of StructuredLogger:
267265
// - std library "log" package: gocql.NewLogger
268266
// - zerolog: gocqlzerolog.NewZerologLogger
269267
// - zap: gocqlzap.NewZapLogger

conn_test.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -349,23 +349,20 @@ func TestCancel(t *testing.T) {
349349

350350
type testQueryObserver struct {
351351
metrics map[string]*hostMetrics
352-
verbose bool
353352
logger StructuredLogger
354353
}
355354

356355
func (o *testQueryObserver) ObserveQuery(ctx context.Context, q ObservedQuery) {
357356
host := q.Host.ConnectAddress().String()
358357
o.metrics[host] = q.Metrics
359-
if o.verbose {
360-
o.logger.Debug("Observed query.",
361-
newLogFieldString("stmt", q.Statement),
362-
newLogFieldInt("rows", q.Rows),
363-
newLogFieldString("duration", q.End.Sub(q.Start).String()),
364-
newLogFieldString("host", host),
365-
newLogFieldInt("attempts", q.Metrics.Attempts),
366-
newLogFieldString("latency", strconv.FormatInt(q.Metrics.TotalLatency, 10)),
367-
newLogFieldError("err", q.Err))
368-
}
358+
o.logger.Debug("Observed query.",
359+
newLogFieldString("stmt", q.Statement),
360+
newLogFieldInt("rows", q.Rows),
361+
newLogFieldString("duration", q.End.Sub(q.Start).String()),
362+
newLogFieldString("host", host),
363+
newLogFieldInt("attempts", q.Metrics.Attempts),
364+
newLogFieldString("latency", strconv.FormatInt(q.Metrics.TotalLatency, 10)),
365+
newLogFieldError("err", q.Err))
369366
}
370367

371368
func (o *testQueryObserver) GetMetrics(host *HostInfo) *hostMetrics {
@@ -418,7 +415,7 @@ func TestQueryRetry(t *testing.T) {
418415
}
419416

420417
func TestQueryMultinodeWithMetrics(t *testing.T) {
421-
log := newTestLogger(LogLevelDebug)
418+
log := newTestLogger(LogLevelNone)
422419
defer func() {
423420
os.Stdout.WriteString(log.String())
424421
}()
@@ -446,7 +443,7 @@ func TestQueryMultinodeWithMetrics(t *testing.T) {
446443

447444
// 1 retry per host
448445
rt := &SimpleRetryPolicy{NumRetries: 3}
449-
observer := &testQueryObserver{metrics: make(map[string]*hostMetrics), verbose: false, logger: log}
446+
observer := &testQueryObserver{metrics: make(map[string]*hostMetrics), logger: log}
450447
qry := db.Query("kill").RetryPolicy(rt).Observer(observer).Idempotent(true)
451448
iter := qry.Iter()
452449
err = iter.Close()
@@ -731,7 +728,7 @@ func TestStream0(t *testing.T) {
731728
session: &Session{
732729
types: GlobalTypes,
733730
},
734-
logger: NewLogger(LogLevelNone),
731+
logger: NewLogger(LogLevelNone),
735732
}
736733

737734
err := conn.recv(context.Background(), false)

control.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ func (c *controlConn) discoverProtocol(hosts []*HostInfo) (int, error) {
264264
return 0, err
265265
}
266266

267-
func (c *controlConn) connect(hosts []*HostInfo) error {
267+
func (c *controlConn) connect(hosts []*HostInfo, sessionInit bool) error {
268268
if len(hosts) == 0 {
269269
return errors.New("control: no endpoints specified")
270270
}
@@ -288,7 +288,7 @@ func (c *controlConn) connect(hosts []*HostInfo) error {
288288
newLogFieldError("err", err))
289289
continue
290290
}
291-
err = c.setupConn(conn)
291+
err = c.setupConn(conn, sessionInit)
292292
if err == nil {
293293
break
294294
}
@@ -317,7 +317,7 @@ type connHost struct {
317317
host *HostInfo
318318
}
319319

320-
func (c *controlConn) setupConn(conn *Conn) error {
320+
func (c *controlConn) setupConn(conn *Conn, sessionInit bool) error {
321321
// we need up-to-date host info for the filterHost call below
322322
iter := conn.querySystemLocal(context.TODO())
323323
host, err := c.session.hostInfoFromIter(iter, conn.host.connectAddress, conn.r.RemoteAddr().(*net.TCPAddr).Port)
@@ -333,7 +333,13 @@ func (c *controlConn) setupConn(conn *Conn) error {
333333
}
334334

335335
if !exists {
336-
c.session.logger.Info("Adding host.",
336+
logLevel := LogLevelInfo
337+
msg := "Added control host."
338+
if sessionInit {
339+
logLevel = LogLevelDebug
340+
msg = "Added control host (session initialization)."
341+
}
342+
logHelper(c.session.logger, logLevel, msg,
337343
newLogFieldIp("host_addr", host.ConnectAddress()), newLogFieldString("host_id", host.HostID()))
338344
}
339345

@@ -424,7 +430,7 @@ func (c *controlConn) reconnect() {
424430

425431
func (c *controlConn) attemptReconnect() (*Conn, error) {
426432

427-
c.session.logger.Info("Reconnecting the control connection.")
433+
c.session.logger.Debug("Reconnecting the control connection.")
428434

429435
hosts := c.session.ring.allHosts()
430436
hosts = shuffleHosts(hosts)
@@ -472,7 +478,7 @@ func (c *controlConn) attemptReconnectToAnyOfHosts(hosts []*HostInfo) (*Conn, er
472478
newLogFieldError("err", err))
473479
continue
474480
}
475-
err = c.setupConn(conn)
481+
err = c.setupConn(conn, false)
476482
if err == nil {
477483
break
478484
}
@@ -500,7 +506,7 @@ func (c *controlConn) HandleError(conn *Conn, err error, closed bool) {
500506
return
501507
}
502508

503-
c.session.logger.Info("Control connection error.",
509+
c.session.logger.Warning("Control connection error.",
504510
newLogFieldIp("host_addr", conn.host.ConnectAddress()),
505511
newLogFieldString("host_id", conn.host.HostID()),
506512
newLogFieldError("err", err))

events.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func (s *Session) handleNodeEvent(frames []frame) {
180180
for _, frame := range frames {
181181
switch f := frame.(type) {
182182
case *topologyChangeEventFrame:
183-
s.logger.Warning("Received topology change event.",
183+
s.logger.Info("Received topology change event.",
184184
newLogFieldString("frame", strings.Join([]string{f.change, "->", f.host.String(), ":", strconv.Itoa(f.port)}, "")))
185185
topologyEventReceived = true
186186
case *statusChangeEventFrame:

logger.go

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,21 @@ import (
3737
// Deprecated: use StructuredLogger instead
3838
type StdLogger interface{}
3939

40+
func logHelper(logger StructuredLogger, level LogLevel, msg string, fields... LogField) {
41+
switch level {
42+
case LogLevelDebug:
43+
logger.Debug(msg, fields...)
44+
case LogLevelInfo:
45+
logger.Info(msg, fields...)
46+
case LogLevelWarn:
47+
logger.Warning(msg, fields...)
48+
case LogLevelError:
49+
logger.Error(msg, fields...)
50+
default:
51+
logger.Error("Unknown log level", newLogFieldInt("level", int(level)), newLogFieldString("msg", msg))
52+
}
53+
}
54+
4055
type nopLogger struct{}
4156

4257
func (n nopLogger) Error(_ string, _ ...LogField) {}
@@ -101,7 +116,21 @@ type defaultLogger struct {
101116
logLevel LogLevel
102117
}
103118

104-
// NewLogger creates an StructuredLogger that uses the standard library "log" package.
119+
// NewLogger creates a StructuredLogger that uses the standard library log package.
120+
//
121+
// This logger will write log messages in the following format:
122+
//
123+
// <LOG_LEVEL> gocql: <message> <fields[0].Name>=<fields[0].Value> <fields[1].Name>=<fields[1].Value>
124+
//
125+
// LOG_LEVEL is always a 3 letter string:
126+
// - DEBUG -> DBG
127+
// - INFO -> INF
128+
// - WARNING -> WRN
129+
// - ERROR -> ERR
130+
//
131+
// Example:
132+
//
133+
// INF gocql: Adding host (session initialization). host_addr=127.0.0.1 host_id=a21dd06e-9e7e-4528-8ad7-039604e25e73
105134
func NewLogger(logLevel LogLevel) StructuredLogger {
106135
return &defaultLogger{logLevel: logLevel}
107136
}
@@ -197,7 +226,9 @@ func newLogField(name string, value LogFieldValue) LogField {
197226

198227
func newLogFieldIp(name string, value net.IP) LogField {
199228
var str string
200-
if value != nil {
229+
if value == nil {
230+
str = "<nil>"
231+
} else {
201232
str = value.String()
202233
}
203234
return newLogField(name, logFieldValueString(str))
@@ -246,7 +277,7 @@ type LogFieldValue struct {
246277
any interface{}
247278
}
248279

249-
// LogFieldValueType is the type of a [LogFieldValue].
280+
// LogFieldValueType is the type of a LogFieldValue.
250281
type LogFieldValueType int
251282

252283
// It's important that LogFieldTypeAny is 0 so that a zero Value represents nil.
@@ -270,7 +301,7 @@ func (v LogFieldValue) LogFieldValueType() LogFieldValueType {
270301
}
271302

272303
func logFieldValueString(value string) LogFieldValue {
273-
return LogFieldValue{num: uint64(len(value)), any: value}
304+
return LogFieldValue{any: value}
274305
}
275306

276307
func logFieldValueInt(v int) LogFieldValue {
@@ -308,9 +339,11 @@ func (v LogFieldValue) Any() interface{} {
308339
}
309340
}
310341

311-
// String returns Value's value as a string, formatted like [fmt.Sprint]. Unlike
312-
// the methods Int64, Float64, and so on, which panic if v is of the
313-
// wrong kind, String never panics.
342+
// String returns LogFieldValue's value as a string, formatted like fmt.Sprint.
343+
//
344+
// Unlike the methods Int64 and Bool which panic if v is of the
345+
// wrong LogFieldValueType, String never panics
346+
// (i.e. it can be called for any LogFieldValueType, not just LogFieldTypeString)
314347
func (v LogFieldValue) String() string {
315348
return v.stringValue()
316349
}

session.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ func (s *Session) init() error {
237237
s.logger.Info("Discovered protocol version.", newLogFieldInt("protocol_version", proto))
238238
}
239239

240-
if err := s.control.connect(hosts); err != nil {
240+
if err := s.control.connect(hosts, true); err != nil {
241241
return err
242242
}
243243

@@ -410,7 +410,7 @@ func (s *Session) reconnectDownedHosts(intv time.Duration) {
410410
if h.IsUp() {
411411
continue
412412
}
413-
s.logger.Info("Reconnecting to downed host.",
413+
s.logger.Debug("Reconnecting to downed host.",
414414
newLogFieldIp("host_addr", h.ConnectAddress()),
415415
newLogFieldInt("host_port", h.Port()),
416416
newLogFieldString("host_id", h.HostID()))

0 commit comments

Comments
 (0)