github.com/whatap/golib@v0.0.22/util/panicutil/panic_helper.go (about) 1 package panicutil 2 3 import ( 4 "context" 5 "fmt" 6 "runtime/debug" 7 "runtime/pprof" 8 "time" 9 10 "github.com/natefinch/lumberjack" 11 ) 12 13 //PanicLogger panic logger 14 func PanicLogger() { 15 if err := recover(); err != nil { 16 errorLogger := getErrorLogger() 17 t := time.Now() 18 errorLogger.Write([]byte(t.Format("2006/01/02 15:04:05 "))) 19 errorLogger.Write([]byte(fmt.Sprint(err))) 20 errorLogger.Write([]byte(string(debug.Stack()))) 21 } 22 } 23 24 var errorLogger *lumberjack.Logger 25 26 func LogAllStack() { 27 if IsDebug { 28 errorLogger := getErrorLogger() 29 t := time.Now() 30 errorLogger.Write([]byte(t.Format("2006/01/02 15:04:05 "))) 31 pprof.Lookup("goroutine").WriteTo(errorLogger, 1) 32 } 33 } 34 35 func DoWithTimeout(timeout time.Duration, doFunc func(), msg string, doPanic bool) { 36 ctx, cancel := context.WithTimeout(context.Background(), timeout) 37 defer cancel() 38 go func() { 39 defer PanicLogger() 40 doFunc() 41 cancel() 42 }() 43 44 select { 45 case <-time.After(timeout): 46 break 47 case <-ctx.Done(): 48 return 49 } 50 51 panicmsg := fmt.Sprint("\n", time.Now().Format("2006/01/02 15:04:05 "), "Operation Timeout", msg) 52 getErrorLogger().Write([]byte(panicmsg)) 53 if doPanic { 54 panic(panicmsg) 55 } 56 } 57 58 func DoWithTimeoutEx(timeout time.Duration, doFunc func(), msg string, onTimeout func()) { 59 ctx, cancel := context.WithTimeout(context.Background(), timeout) 60 defer cancel() 61 go func() { 62 defer PanicLogger() 63 doFunc() 64 cancel() 65 }() 66 67 select { 68 case <-time.After(timeout): 69 break 70 case <-ctx.Done(): 71 return 72 } 73 if onTimeout != nil { 74 onTimeout() 75 } 76 } 77 78 var IsDebug = false 79 80 //Debug Debug 81 func Debug(args ...interface{}) { 82 if IsDebug { 83 errorLogger := getErrorLogger() 84 t := time.Now() 85 message := fmt.Sprintln(t.Format("2006/01/02 15:04:05 [DEBUG] "), args) 86 errorLogger.Write([]byte(message)) 87 } 88 89 } 90 91 //Info Info 92 func Info(args ...interface{}) { 93 errorLogger := getErrorLogger() 94 t := time.Now() 95 message := fmt.Sprintln(t.Format("2006/01/02 15:04:05 [INFO] "), args) 96 errorLogger.Write([]byte(message)) 97 } 98 99 //Error Error 100 func Error(args ...interface{}) { 101 errorLogger := getErrorLogger() 102 t := time.Now() 103 message := fmt.Sprintln(t.Format("2006/01/02 15:04:05 [Error] "), args) 104 errorLogger.Write([]byte(message)) 105 106 } 107 108 //SendEvent SendEvent 109 func SendEvent(title string, message string) { 110 111 }