Fix hilariously complex error stack retrevial
This commit is contained in:
parent
82912595b7
commit
1f1eb507a9
|
@ -69,25 +69,44 @@ func (h *Handler) HandleLog(e *log.Entry) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if err, ok := e.Fields.Get("error").(error); ok {
|
|
||||||
var br = color2.New(color2.Bold, color2.FgRed)
|
var br = color2.New(color2.Bold, color2.FgRed)
|
||||||
|
if err, ok := e.Fields.Get("error").(error); ok {
|
||||||
if e, ok := errors.Cause(err).(tracer); ok {
|
fmt.Fprintf(h.Writer, "\n%s%+v\n\n", br.Sprintf("Stacktrace:"), getErrorStack(err, false))
|
||||||
st := e.StackTrace()
|
|
||||||
|
|
||||||
l := len(st)
|
|
||||||
if l > 5 {
|
|
||||||
l = 5
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(h.Writer, "\n%s%+v\n\n", br.Sprintf("Stacktrace:"), st[0:l])
|
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintf(h.Writer, "\n%s\n%+v\n\n", br.Sprintf("Stacktrace:"), err)
|
fmt.Fprintf(h.Writer, "\n%s%+v\n\n", br.Sprintf("Invalid Error:"), err)
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fmt.Printf("\n\nINVALID ERROR\n\n")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getErrorStack(err error, i bool) errors.StackTrace {
|
||||||
|
e, ok := errors.Cause(err).(tracer)
|
||||||
|
if !ok {
|
||||||
|
if i {
|
||||||
|
// Just abort out of this and return a stacktrace leading up to this point. It isn't perfect
|
||||||
|
// but it'll at least include what function lead to this being called which we can then handle.
|
||||||
|
return errors.Wrap(err, "failed to generate stacktrace for caught error").(tracer).StackTrace()
|
||||||
|
}
|
||||||
|
|
||||||
|
return getErrorStack(errors.New(err.Error()), true)
|
||||||
|
}
|
||||||
|
|
||||||
|
st := e.StackTrace()
|
||||||
|
|
||||||
|
l := len(st)
|
||||||
|
// If this was an internal stack generation we're going to skip over the top four items in the stack
|
||||||
|
// trace since they'll point to the error that was generated by this function.
|
||||||
|
f := 0
|
||||||
|
if i {
|
||||||
|
f = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
if i && l > 9 {
|
||||||
|
l = 9
|
||||||
|
} else if !i && l > 5 {
|
||||||
|
l = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
return st[f:l]
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user