diff --git a/recovery.go b/recovery.go index b1be9dc..4c4c1d9 100644 --- a/recovery.go +++ b/recovery.go @@ -19,7 +19,7 @@ type recoveryHandler struct { // RecoveryOption provides a functional approach to define // configuration for a handler; such as setting the logging -// whether or not to print strack traces on panic. +// whether or not to print stack traces on panic. type RecoveryOption func(http.Handler) func parseRecoveryOptions(h http.Handler, opts ...RecoveryOption) http.Handler { @@ -86,6 +86,11 @@ func (h recoveryHandler) log(v ...interface{}) { } if h.printStack { - debug.PrintStack() + stack := string(debug.Stack()) + if h.logger != nil { + h.logger.Println(stack) + } else { + log.Println(stack) + } } } diff --git a/recovery_test.go b/recovery_test.go index 1ae0e58..f21e43d 100644 --- a/recovery_test.go +++ b/recovery_test.go @@ -30,15 +30,29 @@ func TestRecoveryLoggerWithCustomLogger(t *testing.T) { var buf bytes.Buffer var logger = log.New(&buf, "", log.LstdFlags) - handler := RecoveryHandler(RecoveryLogger(logger), PrintRecoveryStack(false)) handlerFunc := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { panic("Unexpected error!") }) - recovery := handler(handlerFunc) - recovery.ServeHTTP(httptest.NewRecorder(), newRequest("GET", "/subdir/asdf")) + t.Run("Without print stack", func(t *testing.T) { + handler := RecoveryHandler(RecoveryLogger(logger), PrintRecoveryStack(false)) - if !strings.Contains(buf.String(), "Unexpected error!") { - t.Fatalf("Got log %#v, wanted substring %#v", buf.String(), "Unexpected error!") - } + recovery := handler(handlerFunc) + recovery.ServeHTTP(httptest.NewRecorder(), newRequest("GET", "/subdir/asdf")) + + if !strings.Contains(buf.String(), "Unexpected error!") { + t.Fatalf("Got log %#v, wanted substring %#v", buf.String(), "Unexpected error!") + } + }) + + t.Run("With print stack enabled", func(t *testing.T) { + handler := RecoveryHandler(RecoveryLogger(logger), PrintRecoveryStack(true)) + + recovery := handler(handlerFunc) + recovery.ServeHTTP(httptest.NewRecorder(), newRequest("GET", "/subdir/asdf")) + + if !strings.Contains(buf.String(), "runtime/debug.Stack") { + t.Fatalf("Got log %#v, wanted substring %#v", buf.String(), "runtime/debug.Stack") + } + }) }