我正在使用 github.com/sirupsen/logrus 和 github.com/pkg/errors。当我提交一个从 pkg/errors 包装或创建的错误时,我在日志中看到的只是错误消息。我想查看堆栈跟踪。
从这个问题,https://github.com/sirupsen/logrus/issues/506,我推断 logrus 有一些处理 pkg/errors 的本机方法。
我怎样才能做到这一点?
关于您的 Logrus 问题的评论不正确(顺便说一句,似乎来自与 Logrus 没有任何关系的人,并且没有为 Logrus 做出任何贡献,因此实际上不是来自“Logrus 团队”)。
很容易提取pkg/errors错误中的堆栈跟踪,如文档所示:
type stackTracer interface {
StackTrace() errors.StackTrace
}
Run Code Online (Sandbox Code Playgroud)
这意味着使用 logrus 记录堆栈跟踪的最简单方法很简单:
if stackErr, ok := err.(stackTracer); ok {
log.WithField("stacktrace", fmt.Sprintf("%+v", stackErr.StackTrace()))
}
Run Code Online (Sandbox Code Playgroud)
截至今天,当我的拉取请求与 合并pkg/errors时,如果您使用 JSON 日志记录,现在会更容易:
if stackErr, ok := err.(stackTracer); ok {
log.WithField("stacktrace", stackErr.StackTrace())
}
Run Code Online (Sandbox Code Playgroud)
这将生成类似于“%+v”的日志格式,但没有换行符或制表符,每个字符串一个日志条目,以便轻松编组到 JSON 数组中。
当然,这两个选项都强制您使用 定义的格式pkg/errors,这并不总是理想的。因此,您可以迭代堆栈跟踪,并生成您自己的格式,可能会生成可轻松编组为 JSON 的格式。
if err, ok := err.(stackTracer); ok {
for _, f := range err.StackTrace() {
fmt.Printf("%+s:%d\n", f, f) // Or your own formatting
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将其强制转换为您喜欢的任何格式,而不是打印每个帧。