Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion broadcast.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (m *Memberlist) encodeAndBroadcast(node string, msgType messageType, msg in
func (m *Memberlist) encodeBroadcastNotify(node string, msgType messageType, msg interface{}, notify chan struct{}) {
buf, err := encode(msgType, msg)
if err != nil {
m.logger.Printf("[ERR] memberlist: Failed to encode message for broadcast: %s", err)
m.logger.Errorf("Failed to encode message for broadcast: %s", err)
} else {
m.queueBroadcast(node, buf.Bytes(), notify)
}
Expand Down
3 changes: 1 addition & 2 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package memberlist
import (
"fmt"
"io"
"log"
"net"
"os"
"strings"
Expand Down Expand Up @@ -209,7 +208,7 @@ type Config struct {
// this for the internal logger. If Logger is not set, it will fall back to the
// behavior for using LogOutput. You cannot specify both LogOutput and Logger
// at the same time.
Logger *log.Logger
Logger Logger

// Size of Memberlist's internal channel which handles UDP messages. The
// size of this determines the size of the queue which Memberlist will keep
Expand Down
3 changes: 1 addition & 2 deletions integ_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package memberlist

import (
"fmt"
"log"
"os"
"testing"
"time"
Expand Down Expand Up @@ -42,7 +41,7 @@ func TestMemberlist_Integ(t *testing.T) {
c.GossipInterval = 20 * time.Millisecond
c.PushPullInterval = 200 * time.Millisecond
c.SecretKey = secret
c.Logger = log.New(os.Stderr, c.Name, log.LstdFlags)
c.Logger = newNamedLogger(os.Stderr, c.Name)

if i == 0 {
c.Events = &ChannelEventDelegate{eventCh}
Expand Down
48 changes: 48 additions & 0 deletions logging.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,57 @@ package memberlist

import (
"fmt"
"io"
"log"
"net"
"os"
)

type Logger interface {
Debugf(format string, v ...interface{})
Infof(format string, v ...interface{})
Warnf(format string, v ...interface{})
Errorf(format string, v ...interface{})
}

type loggerImpl struct {
logger *log.Logger
}

func newLogger(output io.Writer) Logger {
return newNamedLogger(output, "")
}

func newNamedLogger(output io.Writer, name string) Logger {
return newNamedLoggerWithFlags(output, name, log.LstdFlags)
}

func newNamedLoggerWithFlags(output io.Writer, name string, flags int) Logger {
var logger *log.Logger
if output != nil {
logger = log.New(output, name, flags)
} else {
logger = log.New(os.Stderr, name, flags)
}
return &loggerImpl{logger}
}

func (l *loggerImpl) Debugf(format string, v ...interface{}) {
l.logger.Printf("[DEBUG] memberlist: "+format, v...)
}

func (l *loggerImpl) Infof(format string, v ...interface{}) {
l.logger.Printf("[INFO] memberlist: "+format, v...)
}

func (l *loggerImpl) Warnf(format string, v ...interface{}) {
l.logger.Printf("[WARN] memberlist: "+format, v...)
}

func (l *loggerImpl) Errorf(format string, v ...interface{}) {
l.logger.Printf("[ERROR] memberlist: "+format, v...)
}

func LogAddress(addr net.Addr) string {
if addr == nil {
return "from=<unknown address>"
Expand Down
27 changes: 13 additions & 14 deletions memberlist.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import (
"container/list"
"errors"
"fmt"
"log"
"net"
"os"
"strconv"
Expand All @@ -32,7 +31,7 @@ import (
"github.com/miekg/dns"
)

var errNodeNamesAreRequired = errors.New("memberlist: node names are required by configuration but one was not provided")
var errNodeNamesAreRequired = errors.New("node names are required by configuration but one was not provided")

type Memberlist struct {
sequenceNum uint32 // Local sequence number
Expand Down Expand Up @@ -76,7 +75,7 @@ type Memberlist struct {

broadcasts *TransmitLimitedQueue

logger *log.Logger
logger Logger
}

// BuildVsnArray creates the array of Vsn
Expand Down Expand Up @@ -127,7 +126,7 @@ func newMemberlist(conf *Config) (*Memberlist, error) {

logger := conf.Logger
if logger == nil {
logger = log.New(logDest, "", log.LstdFlags)
logger = newLogger(logDest)
}

// Set up a network transport by default if a custom one wasn't given
Expand All @@ -149,7 +148,7 @@ func newMemberlist(conf *Config) (*Memberlist, error) {
return nt, nil
}
if strings.Contains(err.Error(), "address already in use") {
logger.Printf("[DEBUG] memberlist: Got bind error: %v", err)
logger.Debugf("Got bind error: %v", err)
continue
}
}
Expand All @@ -176,14 +175,14 @@ func newMemberlist(conf *Config) (*Memberlist, error) {
port := nt.GetAutoBindPort()
conf.BindPort = port
conf.AdvertisePort = port
logger.Printf("[DEBUG] memberlist: Using dynamic bind port %d", port)
logger.Debugf("Using dynamic bind port %d", port)
}
transport = nt
}

nodeAwareTransport, ok := transport.(NodeAwareTransport)
if !ok {
logger.Printf("[DEBUG] memberlist: configured Transport is not a NodeAwareTransport and some features may not work as desired")
logger.Debugf("configured Transport is not a NodeAwareTransport and some features may not work as desired")
nodeAwareTransport = &shimNodeAwareTransport{transport}
}

Expand Down Expand Up @@ -254,7 +253,7 @@ func (m *Memberlist) Join(existing []string) (int, error) {
if err != nil {
err = fmt.Errorf("Failed to resolve %s: %v", exist, err)
errs = multierror.Append(errs, err)
m.logger.Printf("[WARN] memberlist: %v", err)
m.logger.Warnf("%v", err)
continue
}

Expand All @@ -264,7 +263,7 @@ func (m *Memberlist) Join(existing []string) (int, error) {
if err := m.pushPullNode(a, true); err != nil {
err = fmt.Errorf("Failed to join %s: %v", addr.ip, err)
errs = multierror.Append(errs, err)
m.logger.Printf("[DEBUG] memberlist: %v", err)
m.logger.Debugf("%v", err)
continue
}
numSuccess++
Expand Down Expand Up @@ -336,7 +335,7 @@ func (m *Memberlist) tcpLookupIP(host string, defaultPort uint16, nodeName strin
case (*dns.AAAA):
ips = append(ips, ipPort{ip: rr.AAAA, port: defaultPort, nodeName: nodeName})
case (*dns.CNAME):
m.logger.Printf("[DEBUG] memberlist: Ignoring CNAME RR in TCP-first answer for '%s'", host)
m.logger.Debugf("Ignoring CNAME RR in TCP-first answer for '%s'", host)
}
}
return ips, nil
Expand Down Expand Up @@ -384,7 +383,7 @@ func (m *Memberlist) resolveAddr(hostStr string) ([]ipPort, error) {
// way to query DNS, and we have a fallback below.
ips, err := m.tcpLookupIP(host, port, nodeName)
if err != nil {
m.logger.Printf("[DEBUG] memberlist: TCP-first lookup failed for '%s', falling back to UDP: %s", hostStr, err)
m.logger.Debugf("TCP-first lookup failed for '%s', falling back to UDP: %s", hostStr, err)
}
if len(ips) > 0 {
return ips, nil
Expand Down Expand Up @@ -427,7 +426,7 @@ func (m *Memberlist) setAlive() error {
}
_, publicIfs, err := sockaddr.IfByRFC("6890", ifAddrs)
if len(publicIfs) > 0 && !m.config.EncryptionEnabled() {
m.logger.Printf("[WARN] memberlist: Binding to public address without encryption!")
m.logger.Warnf("Binding to public address without encryption!")
}

// Set any metadata from the delegate.
Expand Down Expand Up @@ -639,7 +638,7 @@ func (m *Memberlist) Leave(timeout time.Duration) error {
state, ok := m.nodeMap[m.config.Name]
m.nodeLock.Unlock()
if !ok {
m.logger.Printf("[WARN] memberlist: Leave but we're not in the node map.")
m.logger.Warnf("Leave but we're not in the node map.")
return nil
}

Expand Down Expand Up @@ -718,7 +717,7 @@ func (m *Memberlist) Shutdown() error {
// completely torn down. If we kill the memberlist-side handlers
// those I/O handlers might get stuck.
if err := m.transport.Shutdown(); err != nil {
m.logger.Printf("[ERR] Failed to shutdown transport: %v", err)
m.logger.Errorf("Failed to shutdown transport: %v", err)
}

// Now tear down everything else.
Expand Down
11 changes: 5 additions & 6 deletions memberlist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"bytes"
"fmt"
"io/ioutil"
"log"
"net"
"os"
"reflect"
Expand Down Expand Up @@ -47,7 +46,7 @@ func testConfigNet(tb testing.TB, network byte) *Config {
config.Name = config.BindAddr
config.BindPort = 0 // choose free port
config.RequireNodeNames = true
config.Logger = log.New(os.Stderr, config.Name, log.LstdFlags)
config.Logger = newNamedLogger(os.Stderr, config.Name)
return config
}

Expand Down Expand Up @@ -288,7 +287,7 @@ func TestCreate_keyringAndSecretKey(t *testing.T) {
func TestCreate_invalidLoggerSettings(t *testing.T) {
c := DefaultLANConfig()
c.BindAddr = getBindAddr().String()
c.Logger = log.New(ioutil.Discard, "", log.LstdFlags)
c.Logger = newLogger(ioutil.Discard)
c.LogOutput = ioutil.Discard

m, err := Create(c)
Expand Down Expand Up @@ -1488,7 +1487,7 @@ func TestMemberlist_Join_IPv6(t *testing.T) {
c1.Name = "A"
c1.BindAddr = "[::1]"
c1.BindPort = 0 // choose free
c1.Logger = log.New(os.Stderr, c1.Name, log.LstdFlags)
c1.Logger = newNamedLogger(os.Stderr, c1.Name)

m1, err := Create(c1)
require.NoError(t, err)
Expand All @@ -1499,7 +1498,7 @@ func TestMemberlist_Join_IPv6(t *testing.T) {
c2.Name = "B"
c2.BindAddr = "[::1]"
c2.BindPort = 0 // choose free
c2.Logger = log.New(os.Stderr, c2.Name, log.LstdFlags)
c2.Logger = newNamedLogger(os.Stderr, c2.Name)

m2, err := Create(c2)
require.NoError(t, err)
Expand Down Expand Up @@ -1787,7 +1786,7 @@ func TestMemberlist_EncryptedGossipTransition(t *testing.T) {
// Set the gossip interval fast enough to get a reasonable test,
// but slow enough to avoid "sendto: operation not permitted"
conf.GossipInterval = 100 * time.Millisecond
conf.Logger = log.New(os.Stderr, shortName, log.LstdFlags)
conf.Logger = newNamedLogger(os.Stderr, shortName)

pretty[conf.Name] = shortName
return conf
Expand Down
Loading