multilogger.go (66 lines of code) (raw):

package go2chef /* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved */ import ( "fmt" "runtime" ) // MultiLogger is a fan-out logger for use as the central // logging broker in go2chef type MultiLogger struct { loggers []Logger debug int level int } // NewMultiLogger returns a MultiLogger with the provided list // of loggers set up to receive logs. func NewMultiLogger(loggers []Logger) *MultiLogger { return &MultiLogger{ loggers: loggers, debug: int(^uint(0) >> 1), level: LogLevelDebug, } } func (m *MultiLogger) String() string { return "MultiLogger" } // Name returns the name of this logger func (m *MultiLogger) Name() string { return "MultiLogger" } // SetName is a no-op for this logger func (m *MultiLogger) SetName(string) {} // Type returns the type of this logger func (m *MultiLogger) Type() string { return "go2chef.logger.multi" } // Errorf logs a formatted message at ERROR level func (m *MultiLogger) Errorf(s string, v ...interface{}) { for _, l := range m.loggers { l.Errorf(stack2()+s, v...) } } // Infof logs a formatted message at INFO level func (m *MultiLogger) Infof(s string, v ...interface{}) { for _, l := range m.loggers { l.Infof(stack2()+s, v...) } } // Debugf logs a formatted message at DEBUG level func (m *MultiLogger) Debugf(dbg int, s string, v ...interface{}) { for _, l := range m.loggers { l.Debugf(dbg, stack2()+s, v...) } } // SetLevel sets the logger's overall level threshold func (m *MultiLogger) SetLevel(l int) { m.level = l } // SetDebug sets the logger's debug level threshold func (m *MultiLogger) SetDebug(d int) { m.debug = d } // WriteEvent writes an event to all loggers on this MultiLogger func (m *MultiLogger) WriteEvent(e *Event) { for _, l := range m.loggers { l.WriteEvent(e) } } // Shutdown shuts down all loggers on this MultiLogger func (m *MultiLogger) Shutdown() { for _, l := range m.loggers { l.Shutdown() } } func stack2() string { _, f, l, ok := runtime.Caller(2) if ok { return fmt.Sprintf("%s:%d::", f, l) } return "runtime-caller-err::" } var _ Logger = &MultiLogger{}