Skip to content
This repository was archived by the owner on Jul 21, 2025. It is now read-only.

Commit 65e6570

Browse files
committed
session: allow log configuration using Logger interface.
The driver now provides a Logger interface allowing to supply a custom logger as part of (Session)ConnConfig. Driver also provides three implementations of Logger by itself: - DefaultLogger, logging only warnings - DebugLogger, logging everything that can be useful for debugging, it is used by default in tests - NopLogger, logging nothing Fixes #271
1 parent 88fc8ef commit 65e6570

File tree

11 files changed

+159
-57
lines changed

11 files changed

+159
-57
lines changed

log/logger.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package log
2+
3+
import (
4+
"log"
5+
"os"
6+
)
7+
8+
type Logger interface {
9+
Info(v ...any)
10+
Infof(format string, v ...any)
11+
Infoln(v ...any)
12+
13+
Warn(v ...any)
14+
Warnf(format string, v ...any)
15+
Warnln(v ...any)
16+
}
17+
18+
// DefaultLogger only logs warnings and critical errors.
19+
type DefaultLogger struct {
20+
warn *log.Logger
21+
}
22+
23+
func NewDefaultLogger() *DefaultLogger {
24+
res := &DefaultLogger{
25+
warn: log.New(os.Stderr, "WARNING ", log.LstdFlags),
26+
}
27+
return res
28+
}
29+
30+
func (logger *DefaultLogger) Info(v ...any) {}
31+
func (logger *DefaultLogger) Infof(format string, v ...any) {}
32+
func (logger *DefaultLogger) Infoln(v ...any) {}
33+
34+
func (logger *DefaultLogger) Warn(v ...any) { logger.warn.Print(v...) }
35+
func (logger *DefaultLogger) Warnf(format string, v ...any) { logger.warn.Printf(format, v...) }
36+
func (logger *DefaultLogger) Warnln(v ...any) { logger.warn.Println(v...) }
37+
38+
// DebugLogger logs both warnings and information about important events in driver's runtime.
39+
type DebugLogger struct {
40+
info *log.Logger
41+
warn *log.Logger
42+
}
43+
44+
func NewDebugLogger() *DebugLogger {
45+
res := &DebugLogger{
46+
info: log.New(os.Stderr, "INFO ", log.LstdFlags),
47+
warn: log.New(os.Stderr, "WARNING ", log.LstdFlags),
48+
}
49+
return res
50+
}
51+
52+
func (logger *DebugLogger) Info(v ...any) { logger.info.Print(v...) }
53+
func (logger *DebugLogger) Infof(format string, v ...any) { logger.info.Printf(format, v...) }
54+
func (logger *DebugLogger) Infoln(v ...any) { logger.info.Println(v...) }
55+
56+
func (logger *DebugLogger) Warn(v ...any) { logger.warn.Print(v...) }
57+
func (logger *DebugLogger) Warnf(format string, v ...any) { logger.warn.Printf(format, v...) }
58+
func (logger *DebugLogger) Warnln(v ...any) { logger.warn.Println(v...) }
59+
60+
// NopLogger doesn't log anything.
61+
type NopLogger struct{}
62+
63+
func (NopLogger) Info(v ...any) {}
64+
func (NopLogger) Infof(format string, v ...any) {}
65+
func (NopLogger) Infoln(v ...any) {}
66+
67+
func (NopLogger) Warn(v ...any) {}
68+
func (NopLogger) Warnf(format string, v ...any) {}
69+
func (NopLogger) Warnln(v ...any) {}

session.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package scylla
33
import (
44
"context"
55
"fmt"
6-
"log"
76
"sync"
87
"time"
98

109
"github.com/scylladb/scylla-go-driver/frame"
10+
"github.com/scylladb/scylla-go-driver/log"
1111
"github.com/scylladb/scylla-go-driver/transport"
1212
)
1313

@@ -66,6 +66,18 @@ var (
6666
Lz4 Compression = frame.Lz4
6767
)
6868

69+
func NewDefaultLogger() log.Logger {
70+
return log.NewDefaultLogger()
71+
}
72+
73+
func NewDebugLogger() log.Logger {
74+
return log.NewDebugLogger()
75+
}
76+
77+
func NewNopLogger() log.Logger {
78+
return log.NopLogger{}
79+
}
80+
6981
type SessionConfig struct {
7082
Hosts []string
7183
Events []EventType
@@ -271,6 +283,6 @@ func (s *Session) NewTokenAwareDCAwarePolicy(localDC string) transport.HostSelec
271283
}
272284

273285
func (s *Session) Close() {
274-
log.Println("session: close")
286+
s.cfg.Logger.Info("session: close")
275287
s.cluster.Close()
276288
}

session_integration_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ import (
2424

2525
const TestHost = "192.168.100.100"
2626

27-
var testingSessionConfig = DefaultSessionConfig("mykeyspace", TestHost)
27+
var testingSessionConfig = func() SessionConfig {
28+
cfg := DefaultSessionConfig("mykeyspace", TestHost)
29+
cfg.Logger = NewDebugLogger()
30+
return cfg
31+
}()
2832

2933
func initKeyspace(ctx context.Context, t testing.TB) {
3034
t.Helper()

transport/cluster.go

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package transport
33
import (
44
"context"
55
"fmt"
6-
"log"
76
"net"
87
"sort"
98
"strconv"
@@ -160,7 +159,7 @@ func NewCluster(ctx context.Context, cfg ConnConfig, p HostSelectionPolicy, e []
160159
}
161160

162161
func (c *Cluster) NewControl(ctx context.Context) (*Conn, error) {
163-
log.Printf("cluster: open control connection")
162+
c.cfg.Logger.Info("cluster: open control connection")
164163
var errs []string
165164
for addr := range c.knownHosts {
166165
conn, err := OpenConn(ctx, addr, nil, c.cfg)
@@ -184,7 +183,7 @@ func (c *Cluster) NewControl(ctx context.Context) (*Conn, error) {
184183
// refreshTopology creates new topology filled with the result of keyspaceQuery, localQuery and peerQuery.
185184
// Old topology is replaced with the new one atomically to prevent dirty reads.
186185
func (c *Cluster) refreshTopology(ctx context.Context) error {
187-
log.Printf("cluster: refresh topology")
186+
c.cfg.Logger.Infoln("cluster: refresh topology")
188187
rows, err := c.getAllNodesInfo(ctx)
189188
if err != nil {
190189
return fmt.Errorf("query info about nodes in cluster: %w", err)
@@ -242,9 +241,9 @@ func (c *Cluster) refreshTopology(ctx context.Context) error {
242241
}
243242

244243
if ks, ok := t.keyspaces[c.cfg.Keyspace]; ok {
245-
t.policyInfo.Preprocess(t, ks)
244+
t.policyInfo.Preprocess(t, ks, c.cfg.Logger)
246245
} else {
247-
t.policyInfo.Preprocess(t, keyspace{})
246+
t.policyInfo.Preprocess(t, keyspace{}, c.cfg.Logger)
248247
}
249248

250249
c.setTopology(t)
@@ -455,7 +454,7 @@ func (c *Cluster) setTopology(t *topology) {
455454
// of registering handlers for them.
456455
func (c *Cluster) handleEvent(r response) {
457456
if r.Err != nil {
458-
log.Printf("cluster: received event with error: %v", r.Err)
457+
c.cfg.Logger.Infoln("cluster: received event with error: %v", r.Err)
459458
c.RequestReopenControl()
460459
return
461460
}
@@ -467,17 +466,17 @@ func (c *Cluster) handleEvent(r response) {
467466
case *SchemaChange:
468467
// TODO: add schema change.
469468
default:
470-
log.Printf("cluster: unsupported event type: %v", r.Response)
469+
c.cfg.Logger.Warnf("cluster: unsupported event type: %v", r.Response)
471470
}
472471
}
473472

474473
func (c *Cluster) handleTopologyChange(v *TopologyChange) {
475-
log.Printf("cluster: handle topology change: %+#v", v)
474+
c.cfg.Logger.Infof("cluster: handle topology change: %+#v", v)
476475
c.RequestRefresh()
477476
}
478477

479478
func (c *Cluster) handleStatusChange(v *StatusChange) {
480-
log.Printf("cluster: handle status change: %+#v", v)
479+
c.cfg.Logger.Infof("cluster: handle status change: %+#v", v)
481480
m := c.Topology().peers
482481
addr := v.Address.String()
483482
if n, ok := m[addr]; ok {
@@ -487,10 +486,10 @@ func (c *Cluster) handleStatusChange(v *StatusChange) {
487486
case frame.Down:
488487
n.setStatus(statusDown)
489488
default:
490-
log.Printf("cluster: status change not supported: %+#v", v)
489+
c.cfg.Logger.Warnf("cluster: status change not supported: %+#v", v)
491490
}
492491
} else {
493-
log.Printf("cluster: unknown node %s received status change: %+#v in topology %v", addr, v, m)
492+
c.cfg.Logger.Infof("cluster: unknown node %s received status change: %+#v in topology %v, requesting topology refresh", addr, v, m)
494493
c.RequestRefresh()
495494
}
496495
}
@@ -508,7 +507,7 @@ func (c *Cluster) loop(ctx context.Context) {
508507
case <-c.reopenControlChan:
509508
c.tryReopenControl(ctx)
510509
case <-ctx.Done():
511-
log.Printf("cluster closing due to: %v", ctx.Err())
510+
c.cfg.Logger.Infof("cluster closing due to: %v", ctx.Err())
512511
c.handleClose()
513512
return
514513
case <-c.closeChan:
@@ -528,17 +527,17 @@ func (c *Cluster) tryRefresh(ctx context.Context) {
528527
if err := c.refreshTopology(ctx); err != nil {
529528
c.RequestReopenControl()
530529
time.AfterFunc(tryRefreshInterval, c.RequestRefresh)
531-
log.Printf("cluster: refresh topology: %v", err)
530+
c.cfg.Logger.Infof("cluster: refresh topology: %v", err)
532531
}
533532
}
534533

535534
const tryReopenControlInterval = time.Second
536535

537536
func (c *Cluster) tryReopenControl(ctx context.Context) {
538-
log.Printf("cluster: reopen control connection")
537+
c.cfg.Logger.Infoln("cluster: reopen control connection")
539538
if control, err := c.NewControl(ctx); err != nil {
540539
time.AfterFunc(tryReopenControlInterval, c.RequestReopenControl)
541-
log.Printf("cluster: failed to reopen control connection: %v", err)
540+
c.cfg.Logger.Infof("cluster: failed to reopen control connection: %v", err)
542541
} else {
543542
c.control.Close()
544543
c.control = control
@@ -547,7 +546,7 @@ func (c *Cluster) tryReopenControl(ctx context.Context) {
547546
}
548547

549548
func (c *Cluster) handleClose() {
550-
log.Printf("cluster: handle cluster close")
549+
c.cfg.Logger.Infoln("cluster: handle cluster close")
551550
c.control.Close()
552551
m := c.Topology().peers
553552
for _, v := range m {
@@ -558,23 +557,23 @@ func (c *Cluster) handleClose() {
558557
}
559558

560559
func (c *Cluster) RequestRefresh() {
561-
log.Printf("cluster: requested to refresh cluster topology")
560+
c.cfg.Logger.Infoln("cluster: requested to refresh cluster topology")
562561
select {
563562
case c.refreshChan <- struct{}{}:
564563
default:
565564
}
566565
}
567566

568567
func (c *Cluster) RequestReopenControl() {
569-
log.Printf("cluster: requested to reopen control connection")
568+
c.cfg.Logger.Infoln("cluster: requested to reopen control connection")
570569
select {
571570
case c.reopenControlChan <- struct{}{}:
572571
default:
573572
}
574573
}
575574

576575
func (c *Cluster) Close() {
577-
log.Printf("cluster: requested to close cluster")
576+
c.cfg.Logger.Infoln("cluster: requested to close cluster")
578577
select {
579578
case c.closeChan <- struct{}{}:
580579
default:

0 commit comments

Comments
 (0)