diff --git a/logging/config/config.go b/logging/config/config.go index dca01d2ed6049399c11a7f1d251c9a71afa874e8..8616aeb7ac0aec1a18098c127f9bc6daf343d8af 100644 --- a/logging/config/config.go +++ b/logging/config/config.go @@ -15,6 +15,7 @@ import ( type LoggingConfig struct { RootSink *SinkConfig `toml:",omitempty"` ExcludeTrace bool + NonBlocking bool } // For encoding a top-level '[logging]' TOML table diff --git a/logging/lifecycle/lifecycle.go b/logging/lifecycle/lifecycle.go index d130904c2e5b9f2bf3d21aaadd1edda29409eadb..f17622e694153483e4cccd99aa686687cb430982 100644 --- a/logging/lifecycle/lifecycle.go +++ b/logging/lifecycle/lifecycle.go @@ -38,64 +38,56 @@ import ( // Obtain a logger from a LoggingConfig func NewLoggerFromLoggingConfig(loggingConfig *config.LoggingConfig) (*logging.Logger, error) { - var logger *logging.Logger - var errCh channels.Channel - var err error if loggingConfig == nil { - logger, errCh, err = NewStdErrLogger() - if err != nil { - return nil, err - } + return NewStdErrLogger() } else { - outputLogger, err := loggerFromLoggingConfig(loggingConfig) + outputLogger, errCh, err := loggerFromLoggingConfig(loggingConfig) if err != nil { return nil, err } - logger, errCh = NewLogger(outputLogger) + logger := NewLogger(outputLogger) if loggingConfig.ExcludeTrace { logger.Trace = kitlog.NewNopLogger() } + go func() { + err := <-errCh.Out() + if err != nil { + fmt.Printf("Logging error: %v", err) + } + }() + return logger, nil } - go func() { - err := <-errCh.Out() - if err != nil { - fmt.Printf("Logging error: %v", err) - } - }() - - return logger, nil } // Hot swap logging config by replacing output loggers of passed InfoTraceLogger // with those built from loggingConfig -func SwapOutputLoggersFromLoggingConfig(logger *logging.Logger, loggingConfig *config.LoggingConfig) error { - outputLogger, err := loggerFromLoggingConfig(loggingConfig) +func SwapOutputLoggersFromLoggingConfig(logger *logging.Logger, loggingConfig *config.LoggingConfig) (error, channels.Channel) { + outputLogger, errCh, err := loggerFromLoggingConfig(loggingConfig) if err != nil { - return err + return err, channels.NewDeadChannel() } logger.SwapOutput(outputLogger) - return nil + return nil, errCh } -func NewStdErrLogger() (*logging.Logger, channels.Channel, error) { +func NewStdErrLogger() (*logging.Logger, error) { outputLogger, err := loggers.NewStreamLogger(os.Stderr, loggers.TerminalFormat) if err != nil { - return nil, nil, err + return nil, err } - logger, errCh := NewLogger(outputLogger) - return logger, errCh, nil + return NewLogger(outputLogger), nil } // Provided a standard logger that outputs to the supplied underlying outputLogger -func NewLogger(outputLogger kitlog.Logger) (*logging.Logger, channels.Channel) { - logger, errCh := logging.NewLogger(outputLogger) +func NewLogger(outputLogger kitlog.Logger) *logging.Logger { + logger := logging.NewLogger(outputLogger) // Create a random ID based on start time uuid, _ := simpleuuid.NewTime(time.Now()) var runId string if uuid != nil { runId = uuid.String() } - return logger.With(structure.RunId, runId), errCh + return logger.With(structure.RunId, runId) } func JustLogger(logger *logging.Logger, _ channels.Channel) *logging.Logger { @@ -103,15 +95,19 @@ func JustLogger(logger *logging.Logger, _ channels.Channel) *logging.Logger { } func CaptureStdlibLogOutput(infoTraceLogger *logging.Logger) { - stdlib.CaptureRootLogger(infoTraceLogger. - With(structure.CapturedLoggingSourceKey, "stdlib_log")) + stdlib.CaptureRootLogger(infoTraceLogger.With(structure.CapturedLoggingSourceKey, "stdlib_log")) } // Helpers -func loggerFromLoggingConfig(loggingConfig *config.LoggingConfig) (kitlog.Logger, error) { +func loggerFromLoggingConfig(loggingConfig *config.LoggingConfig) (kitlog.Logger, channels.Channel, error) { outputLogger, _, err := loggingConfig.RootSink.BuildLogger() if err != nil { - return nil, err + return nil, nil, err + } + var errCh channels.Channel = channels.NewDeadChannel() + var logger kitlog.Logger = loggers.BurrowFormatLogger(outputLogger) + if loggingConfig.NonBlocking { + logger, errCh = loggers.NonBlockingLogger(logger) } - return outputLogger, nil + return logger, errCh, err } diff --git a/logging/logger.go b/logging/logger.go index 03244b4da435bac02d64bd0687801df789f1a7e7..3382293b9e1dc2c2dba8c2e022bdb635df6bd414 100644 --- a/logging/logger.go +++ b/logging/logger.go @@ -15,9 +15,7 @@ package logging import ( - "github.com/eapache/channels" kitlog "github.com/go-kit/kit/log" - "github.com/hyperledger/burrow/logging/loggers" "github.com/hyperledger/burrow/logging/structure" ) @@ -43,22 +41,21 @@ type Logger struct { } // Create an InfoTraceLogger by passing the initial outputLogger. -func NewLogger(outputLogger kitlog.Logger) (*Logger, channels.Channel) { +func NewLogger(outputLogger kitlog.Logger) *Logger { // We will never halt the progress of a log emitter. If log output takes too // long will start dropping log lines by using a ring buffer. swapLogger := new(kitlog.SwapLogger) swapLogger.Swap(outputLogger) - wrappedOutputLogger, errCh := wrapOutputLogger(swapLogger) return &Logger{ Output: swapLogger, // logging contexts - Info: kitlog.With(wrappedOutputLogger, + Info: kitlog.With(swapLogger, structure.ChannelKey, structure.InfoChannelName, ), - Trace: kitlog.With(wrappedOutputLogger, + Trace: kitlog.With(swapLogger, structure.ChannelKey, structure.TraceChannelName, ), - }, errCh + } } func NewNoopLogger() *Logger { @@ -140,10 +137,3 @@ func Msg(logger kitlog.Logger, message string, keyvals ...interface{}) error { prepended := structure.CopyPrepend(keyvals, structure.MessageKey, message) return logger.Log(prepended...) } - -// Wrap the output loggers with a a set of standard transforms, a non-blocking -// ChannelLogger and an outer context -func wrapOutputLogger(outputLogger kitlog.Logger) (kitlog.Logger, channels.Channel) { - return loggers.NonBlockingLogger(loggers.BurrowFormatLogger(outputLogger)) - //return loggers.BurrowFormatLogger(outputLogger), channels.NewDeadChannel() -} diff --git a/logging/logger_test.go b/logging/logger_test.go index 05c0858c1764171c1776ca9be766e5aed6ab3c7f..0829fb39c389e9f15c8d64dfda160b68f230d0f4 100644 --- a/logging/logger_test.go +++ b/logging/logger_test.go @@ -23,7 +23,7 @@ import ( func TestLogger(t *testing.T) { stderrLogger := kitlog.NewLogfmtLogger(os.Stderr) - logger, _ := NewLogger(stderrLogger) + logger := NewLogger(stderrLogger) logger.Trace.Log("hello", "barry") }