1package 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 25import ( 26 "fmt" 27 "os" 28) 29 30var handlers = []func(){} 31 32func 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 42func 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) 49func Exit(code int) { 50 runHandlers() 51 os.Exit(code) 52} 53 54// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke 55// all handlers. The handlers will also be invoked when any Fatal log entry is 56// 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. 62func RegisterExitHandler(handler func()) { 63 handlers = append(handlers, handler) 64} 65