forked from mirror/logrus
Add a DeferExitHandler function
Useful for running exit handlers in the same order as defer statements
This commit is contained in:
parent
7d8d63893b
commit
4ea4861398
18
alt_exit.go
18
alt_exit.go
|
@ -51,9 +51,9 @@ func Exit(code int) {
|
||||||
os.Exit(code)
|
os.Exit(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke
|
// RegisterExitHandler appends a Logrus Exit handler to the list of handlers,
|
||||||
// all handlers. The handlers will also be invoked when any Fatal log entry is
|
// call logrus.Exit to invoke all handlers. The handlers will also be invoked when
|
||||||
// made.
|
// any Fatal log entry is made.
|
||||||
//
|
//
|
||||||
// This method is useful when a caller wishes to use logrus to log a fatal
|
// This method is useful when a caller wishes to use logrus to log a fatal
|
||||||
// message but also needs to gracefully shutdown. An example usecase could be
|
// message but also needs to gracefully shutdown. An example usecase could be
|
||||||
|
@ -62,3 +62,15 @@ func Exit(code int) {
|
||||||
func RegisterExitHandler(handler func()) {
|
func RegisterExitHandler(handler func()) {
|
||||||
handlers = append(handlers, handler)
|
handlers = append(handlers, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeferExitHandler prepends a Logrus Exit handler to the list of handlers,
|
||||||
|
// call logrus.Exit to invoke all handlers. The handlers will also be invoked when
|
||||||
|
// any Fatal log entry is made.
|
||||||
|
//
|
||||||
|
// This method is useful when a caller wishes to use logrus to log a fatal
|
||||||
|
// message but also needs to gracefully shutdown. An example usecase could be
|
||||||
|
// closing database connections, or sending a alert that the application is
|
||||||
|
// closing.
|
||||||
|
func DeferExitHandler(handler func()) {
|
||||||
|
handlers = append([]func(){handler}, handlers...)
|
||||||
|
}
|
||||||
|
|
|
@ -14,9 +14,61 @@ import (
|
||||||
|
|
||||||
func TestRegister(t *testing.T) {
|
func TestRegister(t *testing.T) {
|
||||||
current := len(handlers)
|
current := len(handlers)
|
||||||
RegisterExitHandler(func() {})
|
|
||||||
if len(handlers) != current+1 {
|
var results []string
|
||||||
t.Fatalf("expected %d handlers, got %d", current+1, len(handlers))
|
|
||||||
|
h1 := func() { results = append(results, "first") }
|
||||||
|
h2 := func() { results = append(results, "second") }
|
||||||
|
|
||||||
|
RegisterExitHandler(h1)
|
||||||
|
RegisterExitHandler(h2)
|
||||||
|
|
||||||
|
if len(handlers) != current+2 {
|
||||||
|
t.Fatalf("expected %d handlers, got %d", current+2, len(handlers))
|
||||||
|
}
|
||||||
|
|
||||||
|
runHandlers()
|
||||||
|
|
||||||
|
if len(results) != 2 {
|
||||||
|
t.Fatalf("expected 2 handlers to be run, ran %d", len(results))
|
||||||
|
}
|
||||||
|
|
||||||
|
if results[0] != "first" {
|
||||||
|
t.Fatal("expected handler h1 to be run first, but it wasn't")
|
||||||
|
}
|
||||||
|
|
||||||
|
if results[1] != "second" {
|
||||||
|
t.Fatal("expected handler h2 to be run second, but it wasn't")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDefer(t *testing.T) {
|
||||||
|
current := len(handlers)
|
||||||
|
|
||||||
|
var results []string
|
||||||
|
|
||||||
|
h1 := func() { results = append(results, "first") }
|
||||||
|
h2 := func() { results = append(results, "second") }
|
||||||
|
|
||||||
|
DeferExitHandler(h1)
|
||||||
|
DeferExitHandler(h2)
|
||||||
|
|
||||||
|
if len(handlers) != current+2 {
|
||||||
|
t.Fatalf("expected %d handlers, got %d", current+2, len(handlers))
|
||||||
|
}
|
||||||
|
|
||||||
|
runHandlers()
|
||||||
|
|
||||||
|
if len(results) != 2 {
|
||||||
|
t.Fatalf("expected 2 handlers to be run, ran %d", len(results))
|
||||||
|
}
|
||||||
|
|
||||||
|
if results[0] != "second" {
|
||||||
|
t.Fatal("expected handler h2 to be run first, but it wasn't")
|
||||||
|
}
|
||||||
|
|
||||||
|
if results[1] != "first" {
|
||||||
|
t.Fatal("expected handler h1 to be run second, but it wasn't")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue