diff --git a/alt_exit.go b/alt_exit.go index f1bb44c..183db77 100644 --- a/alt_exit.go +++ b/alt_exit.go @@ -45,11 +45,15 @@ func runHandlers() { } } -type exitFunc func(int) - // Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) func Exit(code int) { runHandlers() + osExit(code) +} + +type exitFunc func(int) + +func osExit(code int) { os.Exit(code) } diff --git a/hooks/test/test.go b/hooks/test/test.go index f84fe80..234a17d 100644 --- a/hooks/test/test.go +++ b/hooks/test/test.go @@ -39,24 +39,12 @@ func NewLocal(logger *logrus.Logger) *Hook { } -type TestOption func(logger *logrus.Logger) - -func FatalPanics(logger *logrus.Logger) { - logger.Exit = func(code int) { - panic(code) - } -} - // NewNullLogger creates a discarding logger and installs the test hook. -func NewNullLogger(options ...TestOption) (*logrus.Logger, *Hook) { +func NewNullLogger() (*logrus.Logger, *Hook) { logger := logrus.New() logger.Out = ioutil.Discard - for _, option := range options { - option(logger) - } - return logger, NewLocal(logger) } diff --git a/hooks/test/test_test.go b/hooks/test/test_test.go index 692d36a..636bad5 100644 --- a/hooks/test/test_test.go +++ b/hooks/test/test_test.go @@ -72,13 +72,14 @@ func TestLoggingWithHooksRace(t *testing.T) { assert.Equal(100, len(entries)) } -func TestFatalWithPanic(t *testing.T) { +func TestFatalWithAlternateExit(t *testing.T) { assert := assert.New(t) - logger, hook := NewNullLogger(FatalPanics) + logger, hook := NewNullLogger() + logger.ExitFunc = func(code int) {} - assert.Nil(hook.LastEntry()) - assert.Equal(0, len(hook.Entries)) - - assert.Panics(func() { logger.Fatal("something went wrong") }) + logger.Fatal("something went very wrong") + assert.Equal(logrus.FatalLevel, hook.LastEntry().Level) + assert.Equal("something went very wrong", hook.LastEntry().Message) + assert.Equal(1, len(hook.Entries)) } diff --git a/logger.go b/logger.go index 188c600..364819e 100644 --- a/logger.go +++ b/logger.go @@ -32,8 +32,8 @@ type Logger struct { mu MutexWrap // Reusable empty entry entryPool sync.Pool - // Function to exit the application, defaults to `Exit()` - Exit exitFunc + // Function to exit the application, defaults to `osExit()` + ExitFunc exitFunc } type MutexWrap struct { @@ -75,7 +75,7 @@ func New() *Logger { Formatter: new(TextFormatter), Hooks: make(LevelHooks), Level: InfoLevel, - Exit: Exit, + ExitFunc: osExit, } } @@ -313,6 +313,14 @@ func (logger *Logger) Panicln(args ...interface{}) { } } +func (logger *Logger) Exit(code int) { + runHandlers() + if logger.ExitFunc == nil { + logger.ExitFunc = osExit + } + logger.ExitFunc(code) +} + //When file is opened with appending mode, it's safe to //write concurrently to a file (within 4k message on Linux). //In these cases user can choose to disable the lock. diff --git a/logrus.go b/logrus.go index fa0b9de..6fff506 100644 --- a/logrus.go +++ b/logrus.go @@ -69,7 +69,7 @@ const ( // PanicLevel level, highest level of severity. Logs and then calls panic with the // message passed to Debug, Info, ... PanicLevel Level = iota - // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the + // FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the // logging level is set to Panic. FatalLevel // ErrorLevel level. Logs. Used for errors that should definitely be noted.