diff --git a/logger.go b/logger.go index 445bc5212..93b12c3f8 100644 --- a/logger.go +++ b/logger.go @@ -17,7 +17,6 @@ package pilosa import ( "io" "log" - "os" ) // Ensure nopLogger implements interface. @@ -27,7 +26,6 @@ var _ Logger = &nopLogger{} type Logger interface { Printf(format string, v ...interface{}) Debugf(format string, v ...interface{}) - Close() error } func init() { @@ -45,34 +43,15 @@ func (n *nopLogger) Printf(format string, v ...interface{}) {} // Debugf is a no-op implementation of the Logger Debugf method. func (n *nopLogger) Debugf(format string, v ...interface{}) {} -// Close is a no-op implementation of the Logger Close method. -func (n *nopLogger) Close() error { return nil } - // StandardLogger is a basic implementation of pilosa.Logger based on log.Logger. type StandardLogger struct { logger *log.Logger - f *os.File } -func NewStandardLogger(path string, defaultWriter io.Writer) (*StandardLogger, error) { - var lw io.Writer - var err error - var f *os.File - - if path == "" { - lw = defaultWriter - } else { - f, err = os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) - if err != nil { - return nil, err - } - lw = f - } - +func NewStandardLogger(w io.Writer) *StandardLogger { return &StandardLogger{ - logger: log.New(lw, "", log.LstdFlags), - f: f, - }, nil + logger: log.New(w, "", log.LstdFlags), + } } func (s *StandardLogger) Printf(format string, v ...interface{}) { @@ -81,13 +60,6 @@ func (s *StandardLogger) Printf(format string, v ...interface{}) { func (s *StandardLogger) Debugf(format string, v ...interface{}) {} -func (s *StandardLogger) Close() error { - if s.f == nil { - return nil - } - return s.f.Close() -} - func (s *StandardLogger) Logger() *log.Logger { return s.logger } @@ -95,28 +67,12 @@ func (s *StandardLogger) Logger() *log.Logger { // VerboseLogger is an implementation of pilosa.Logger which includes debug messages. type VerboseLogger struct { logger *log.Logger - f *os.File } -func NewVerboseLogger(path string, defaultWriter io.Writer) (*VerboseLogger, error) { - var lw io.Writer - var err error - var f *os.File - - if path == "" { - lw = defaultWriter - } else { - f, err = os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) - if err != nil { - return nil, err - } - lw = f - } - +func NewVerboseLogger(w io.Writer) *VerboseLogger { return &VerboseLogger{ - logger: log.New(lw, "", log.LstdFlags), - f: f, - }, nil + logger: log.New(w, "", log.LstdFlags), + } } func (vb *VerboseLogger) Printf(format string, v ...interface{}) { @@ -127,13 +83,6 @@ func (vb *VerboseLogger) Debugf(format string, v ...interface{}) { vb.logger.Printf(format, v...) } -func (vb *VerboseLogger) Close() error { - if vb.f == nil { - return nil - } - return vb.f.Close() -} - func (vb *VerboseLogger) Logger() *log.Logger { return vb.logger } diff --git a/server/server.go b/server/server.go index 4141ae3aa..66725f4ee 100644 --- a/server/server.go +++ b/server/server.go @@ -74,7 +74,8 @@ type Command struct { Done chan struct{} // Passed to the Gossip implementation. - logger *log.Logger + logOutput io.Writer + logger *log.Logger } // NewCommand returns a new instance of Main. @@ -125,18 +126,22 @@ func (m *Command) Run(args ...string) (err error) { // SetupLogger sets up the logger based on the configuration. func (m *Command) SetupLogger() error { - if m.Config.Verbose { - vbl, err := pilosa.NewVerboseLogger(m.Config.LogPath, m.Stderr) + var err error + if m.Config.LogPath == "" { + m.logOutput = m.Stderr + } else { + m.logOutput, err = os.OpenFile(m.Config.LogPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) if err != nil { return err } + } + + if m.Config.Verbose { + vbl := pilosa.NewVerboseLogger(m.logOutput) m.logger = vbl.Logger() m.Server.Logger = vbl } else { - sl, err := pilosa.NewStandardLogger(m.Config.LogPath, m.Stderr) - if err != nil { - return err - } + sl := pilosa.NewStandardLogger(m.logOutput) m.logger = sl.Logger() m.Server.Logger = sl } @@ -292,9 +297,11 @@ func (m *Command) SetupNetworking() error { // Close shuts down the server. func (m *Command) Close() error { + var logErr error serveErr := m.Server.Close() - logErr := m.Server.Logger.Close() - + if closer, ok := m.logOutput.(io.Closer); ok { + logErr = closer.Close() + } close(m.Done) if serveErr != nil && logErr != nil { return fmt.Errorf("closing server: '%v', closing logs: '%v'", serveErr, logErr) diff --git a/test/logger.go b/test/logger.go index ae5984bb7..b4a0079b1 100644 --- a/test/logger.go +++ b/test/logger.go @@ -43,8 +43,6 @@ func (b *BufferLogger) Printf(format string, v ...interface{}) { func (b *BufferLogger) Debugf(format string, v ...interface{}) {} -func (b *BufferLogger) Close() error { return nil } - func (b *BufferLogger) ReadAll() ([]byte, error) { return ioutil.ReadAll(b.buf) }