diff --git a/logging.go b/logging.go index 7b5c16e5..f747b2dd 100644 --- a/logging.go +++ b/logging.go @@ -1,17 +1,14 @@ package ipfscluster import ( - "bufio" - "bytes" "log" "strings" - "time" logging "github.com/ipfs/go-log" ) var logger = logging.Logger("cluster") -var raftStdLogger = makeRaftLogger() +var raftStdLogger = log.New(&logForwarder{}, "", 0) var raftLogger = logging.Logger("raft") // SetFacilityLogLevel sets the log level for a given module @@ -27,33 +24,25 @@ func SetFacilityLogLevel(f, l string) { logging.SetLogLevel(f, l) } -// This redirects Raft output to our logger -func makeRaftLogger() *log.Logger { - var buf bytes.Buffer - rLogger := log.New(&buf, "", 0) - reader := bufio.NewReader(&buf) - go func() { - for { - t, err := reader.ReadString('\n') - if err != nil { - time.Sleep(time.Second) - continue - } - t = strings.TrimSuffix(t, "\n") +// implements the writer interface +type logForwarder struct{} - switch { - case strings.Contains(t, "[DEBUG]"): - raftLogger.Debug(strings.TrimPrefix(t, "[DEBUG] raft: ")) - case strings.Contains(t, "[WARN]"): - raftLogger.Warning(strings.TrimPrefix(t, "[WARN] raft: ")) - case strings.Contains(t, "[ERR]"): - raftLogger.Error(strings.TrimPrefix(t, "[ERR] raft: ")) - case strings.Contains(t, "[INFO]"): - raftLogger.Info(strings.TrimPrefix(t, "[INFO] raft: ")) - default: - raftLogger.Debug(t) - } - } - }() - return rLogger +// Write forwards to our go-log logger. +// According to https://golang.org/pkg/log/#Logger.Output +// it is called per line. +func (fw *logForwarder) Write(p []byte) (n int, err error) { + t := strings.TrimSuffix(string(p), "\n") + switch { + case strings.Contains(t, "[DEBUG]"): + raftLogger.Debug(strings.TrimPrefix(t, "[DEBUG] raft: ")) + case strings.Contains(t, "[WARN]"): + raftLogger.Warning(strings.TrimPrefix(t, "[WARN] raft: ")) + case strings.Contains(t, "[ERR]"): + raftLogger.Error(strings.TrimPrefix(t, "[ERR] raft: ")) + case strings.Contains(t, "[INFO]"): + raftLogger.Info(strings.TrimPrefix(t, "[INFO] raft: ")) + default: + raftLogger.Debug(t) + } + return len(p), nil }