alt_exit.go (2802B)
1 package logrus 2 3 // The following code was sourced and modified from the 4 // https://github.com/tebeka/atexit package governed by the following license: 5 // 6 // Copyright (c) 2012 Miki Tebeka <miki.tebeka@gmail.com>. 7 // 8 // Permission is hereby granted, free of charge, to any person obtaining a copy of 9 // this software and associated documentation files (the "Software"), to deal in 10 // the Software without restriction, including without limitation the rights to 11 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 12 // the Software, and to permit persons to whom the Software is furnished to do so, 13 // subject to the following conditions: 14 // 15 // The above copyright notice and this permission notice shall be included in all 16 // copies or substantial portions of the Software. 17 // 18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 20 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 21 // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 22 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25 import ( 26 "fmt" 27 "os" 28 ) 29 30 var handlers = []func(){} 31 32 func runHandler(handler func()) { 33 defer func() { 34 if err := recover(); err != nil { 35 fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err) 36 } 37 }() 38 39 handler() 40 } 41 42 func runHandlers() { 43 for _, handler := range handlers { 44 runHandler(handler) 45 } 46 } 47 48 // Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) 49 func Exit(code int) { 50 runHandlers() 51 os.Exit(code) 52 } 53 54 // RegisterExitHandler appends a Logrus Exit handler to the list of handlers, 55 // call logrus.Exit to invoke all handlers. The handlers will also be invoked when 56 // any Fatal log entry is made. 57 // 58 // This method is useful when a caller wishes to use logrus to log a fatal 59 // message but also needs to gracefully shutdown. An example usecase could be 60 // closing database connections, or sending a alert that the application is 61 // closing. 62 func RegisterExitHandler(handler func()) { 63 handlers = append(handlers, handler) 64 } 65 66 // DeferExitHandler prepends a Logrus Exit handler to the list of handlers, 67 // call logrus.Exit to invoke all handlers. The handlers will also be invoked when 68 // any Fatal log entry is made. 69 // 70 // This method is useful when a caller wishes to use logrus to log a fatal 71 // message but also needs to gracefully shutdown. An example usecase could be 72 // closing database connections, or sending a alert that the application is 73 // closing. 74 func DeferExitHandler(handler func()) { 75 handlers = append([]func(){handler}, handlers...) 76 }