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

Commit 5369a73

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 c06f706 commit 5369a73

File tree

12 files changed

+148
-59
lines changed

12 files changed

+148
-59
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: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package scylla
33
import (
44
"context"
55
"fmt"
6-
"log"
76
"sync"
87
"time"
98

@@ -271,6 +270,6 @@ func (s *Session) NewTokenAwareDCAwarePolicy(localDC string) transport.HostSelec
271270
}
272271

273272
func (s *Session) Close() {
274-
log.Println("session: close")
273+
s.cfg.Logger.Info("session: close")
275274
s.cluster.Close()
276275
}

session_integration_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ import (
1818

1919
"github.com/scylladb/scylla-go-driver/frame"
2020
"github.com/scylladb/scylla-go-driver/frame/response"
21+
"github.com/scylladb/scylla-go-driver/log"
2122
"github.com/scylladb/scylla-go-driver/transport"
2223
"go.uber.org/goleak"
2324
)
2425

2526
const TestHost = "192.168.100.100"
2627

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

2934
func initKeyspace(ctx context.Context, t testing.TB) {
3035
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)
@@ -236,9 +235,9 @@ func (c *Cluster) refreshTopology(ctx context.Context) error {
236235
}
237236

238237
if ks, ok := t.keyspaces[c.cfg.Keyspace]; ok {
239-
t.policyInfo.Preprocess(t, ks)
238+
t.policyInfo.Preprocess(t, ks, c.cfg.Logger)
240239
} else {
241-
t.policyInfo.Preprocess(t, keyspace{})
240+
t.policyInfo.Preprocess(t, keyspace{}, c.cfg.Logger)
242241
}
243242

244243
c.setTopology(t)
@@ -450,7 +449,7 @@ func (c *Cluster) setTopology(t *topology) {
450449
// of registering handlers for them.
451450
func (c *Cluster) handleEvent(ctx context.Context, r response) {
452451
if r.Err != nil {
453-
log.Printf("cluster: received event with error: %v", r.Err)
452+
c.cfg.Logger.Infoln("cluster: received event with error: %v", r.Err)
454453
c.RequestReopenControl()
455454
return
456455
}
@@ -462,17 +461,17 @@ func (c *Cluster) handleEvent(ctx context.Context, r response) {
462461
case *SchemaChange:
463462
// TODO: add schema change.
464463
default:
465-
log.Printf("cluster: unsupported event type: %v", r.Response)
464+
c.cfg.Logger.Warnf("cluster: unsupported event type: %v", r.Response)
466465
}
467466
}
468467

469468
func (c *Cluster) handleTopologyChange(v *TopologyChange) {
470-
log.Printf("cluster: handle topology change: %+#v", v)
469+
c.cfg.Logger.Infof("cluster: handle topology change: %+#v", v)
471470
c.RequestRefresh()
472471
}
473472

474473
func (c *Cluster) handleStatusChange(ctx context.Context, v *StatusChange) {
475-
log.Printf("cluster: handle status change: %+#v", v)
474+
c.cfg.Logger.Infof("cluster: handle status change: %+#v", v)
476475
m := c.Topology().peers
477476
addr := v.Address.String()
478477
if n, ok := m[addr]; ok {
@@ -482,10 +481,10 @@ func (c *Cluster) handleStatusChange(ctx context.Context, v *StatusChange) {
482481
case frame.Down:
483482
n.setStatus(statusDown)
484483
default:
485-
log.Printf("cluster: status change not supported: %+#v", v)
484+
c.cfg.Logger.Warnf("cluster: status change not supported: %+#v", v)
486485
}
487486
} else {
488-
log.Printf("cluster: unknown node %s received status change: %+#v in topology %v", addr, v, m)
487+
c.cfg.Logger.Infof("cluster: unknown node %s received status change: %+#v in topology %v, requesting topology refresh", addr, v, m)
489488
c.RequestRefresh()
490489
}
491490
}
@@ -503,7 +502,7 @@ func (c *Cluster) loop(ctx context.Context) {
503502
case <-c.reopenControlChan:
504503
c.tryReopenControl(ctx)
505504
case <-ctx.Done():
506-
log.Printf("cluster closing due to: %v", ctx.Err())
505+
c.cfg.Logger.Infof("cluster closing due to: %v", ctx.Err())
507506
c.handleClose()
508507
return
509508
case <-c.closeChan:
@@ -523,17 +522,17 @@ func (c *Cluster) tryRefresh(ctx context.Context) {
523522
if err := c.refreshTopology(ctx); err != nil {
524523
c.RequestReopenControl()
525524
time.AfterFunc(tryRefreshInterval, c.RequestRefresh)
526-
log.Printf("cluster: refresh topology: %v", err)
525+
c.cfg.Logger.Infof("cluster: refresh topology: %v", err)
527526
}
528527
}
529528

530529
const tryReopenControlInterval = time.Second
531530

532531
func (c *Cluster) tryReopenControl(ctx context.Context) {
533-
log.Printf("cluster: reopen control connection")
532+
c.cfg.Logger.Infoln("cluster: reopen control connection")
534533
if control, err := c.NewControl(ctx); err != nil {
535534
time.AfterFunc(tryReopenControlInterval, c.RequestReopenControl)
536-
log.Printf("cluster: failed to reopen control connection: %v", err)
535+
c.cfg.Logger.Infof("cluster: failed to reopen control connection: %v", err)
537536
} else {
538537
c.control.Close()
539538
c.control = control
@@ -542,7 +541,7 @@ func (c *Cluster) tryReopenControl(ctx context.Context) {
542541
}
543542

544543
func (c *Cluster) handleClose() {
545-
log.Printf("cluster: handle cluster close")
544+
c.cfg.Logger.Infoln("cluster: handle cluster close")
546545
c.control.Close()
547546
m := c.Topology().peers
548547
for _, n := range m {
@@ -551,23 +550,23 @@ func (c *Cluster) handleClose() {
551550
}
552551

553552
func (c *Cluster) RequestRefresh() {
554-
log.Printf("cluster: requested to refresh cluster topology")
553+
c.cfg.Logger.Infoln("cluster: requested to refresh cluster topology")
555554
select {
556555
case c.refreshChan <- struct{}{}:
557556
default:
558557
}
559558
}
560559

561560
func (c *Cluster) RequestReopenControl() {
562-
log.Printf("cluster: requested to reopen control connection")
561+
c.cfg.Logger.Infoln("cluster: requested to reopen control connection")
563562
select {
564563
case c.reopenControlChan <- struct{}{}:
565564
default:
566565
}
567566
}
568567

569568
func (c *Cluster) Close() {
570-
log.Printf("cluster: requested to close cluster")
569+
c.cfg.Logger.Infoln("cluster: requested to close cluster")
571570
select {
572571
case c.closeChan <- struct{}{}:
573572
default:

0 commit comments

Comments
 (0)