gitee.com/h79/goutils@v1.22.10/common/debug/debug.go (about) 1 package debug 2 3 import ( 4 "errors" 5 "fmt" 6 "gitee.com/h79/goutils/common/config" 7 "gitee.com/h79/goutils/common/json" 8 "runtime/debug" 9 "strings" 10 ) 11 12 type Debug struct { 13 Code int32 `json:"code"` 14 Title string `json:"title"` 15 Name string `json:"name"` //服务名称 16 Module string `json:"module"` //模板名 17 Detail string `json:"detail"` //简单描述 18 Stack string `json:"stack"` //调用堆栈 19 More string `json:"more"` //更多 20 Level Level `json:"level"` //级别(严重程度) 21 ErrMsg string `json:"errMsg"` 22 err error `json:"-"` 23 } 24 25 type Level int32 26 27 const ( 28 DUnkLevel = Level(0) 29 DNormalLevel = Level(1) 30 DImportantLevel = Level(2) 31 DTightLevel = Level(3) // 紧级 32 DFatalLevel = Level(4) // 致命 33 ) 34 35 func NewStack(code int32) *Debug { 36 return &Debug{ 37 Code: code, 38 Name: config.AppName, 39 Stack: string(debug.Stack()), 40 } 41 } 42 43 func New(code int32) *Debug { 44 return &Debug{ 45 Code: code, 46 Name: config.AppName, 47 } 48 } 49 50 func (d *Debug) String() string { 51 return json.ToString(d) 52 } 53 54 func (d *Debug) Error() error { 55 return d.newErr().err 56 } 57 58 func (d *Debug) newErr() *Debug { 59 if d.err == nil && len(d.ErrMsg) > 0 { 60 d.err = errors.New(d.ErrMsg) 61 } 62 return d 63 } 64 65 func (d *Debug) WithDetailFormat(format string, a ...interface{}) *Debug { 66 d.Detail = fmt.Sprintf(format, a...) 67 return d 68 } 69 70 func (d *Debug) WithDetail(detail string) *Debug { 71 d.Detail = detail 72 return d 73 } 74 75 func (d *Debug) WithError(er error) *Debug { 76 d.err = er 77 if er != nil { 78 d.ErrMsg = er.Error() 79 } 80 return d 81 } 82 83 func (d *Debug) WithErrMsg(er string) *Debug { 84 d.ErrMsg = er 85 return d.newErr() 86 } 87 88 func (d *Debug) WithName(name string) *Debug { 89 d.Name = name 90 return d 91 } 92 93 func (d *Debug) WithModule(module string) *Debug { 94 d.Module = module 95 return d 96 } 97 98 func (d *Debug) WithLevel(l Level) *Debug { 99 d.Level = l 100 return d 101 } 102 103 func (d *Debug) WithTitle(title string) *Debug { 104 d.Title = title 105 return d 106 } 107 108 func (d *Debug) WithStack() *Debug { 109 d.Stack = string(debug.Stack()) 110 return d 111 } 112 113 func (d *Debug) WithMoreFormat(more string, a ...interface{}) *Debug { 114 d.More = fmt.Sprintf(more, a...) 115 return d 116 } 117 118 func (d *Debug) WithMore(more string) *Debug { 119 d.More = more 120 return d 121 } 122 123 func (d *Debug) MoreTo() string { 124 if len(d.Stack) == 0 { 125 return d.More 126 } 127 if len(d.More) == 0 { 128 return d.Stack 129 } 130 b := strings.Builder{} 131 b.WriteString(d.More) 132 b.WriteString("\r\n\r\nStack---------------\r\n") 133 b.WriteString(d.Stack) 134 return b.String() 135 }