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  }