gpt4 book ai didi

go - 如何让 logrus 打印 pkg/errors 堆栈

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:15 45 4
gpt4 key购买 nike

我正在使用 github.com/sirupsen/logrus 和 github.com/pkg/errors。当我提交一个从 pkg/errors 包装或创建的错误时,我在注销中看到的只是错误消息。我想查看堆栈跟踪。

从本期,https://github.com/sirupsen/logrus/issues/506 ,我推断 logrus 有一些处理 pkg/errors 的 native 方法。

我该怎么做?

最佳答案

对您的 Logrus 问题的评论是不正确的(顺便说一下,似乎来自与 Logrus 没有任何关系且对 Logrus 没有做出任何贡献的人,所以实际上不是来自“Logrus 团队”)。

很容易在pkg/errors 错误中提取堆栈跟踪,as documented :

type stackTracer interface {
StackTrace() errors.StackTrace
}

这意味着使用 logrus 记录堆栈跟踪的最简单方法就是:

if stackErr, ok := err.(stackTracer); ok {
log.WithField("stacktrace", fmt.Sprintf("%+v", stackErr.StackTrace()))
}

截至今天,当my a pull request of mine was merged with pkg/errors ,如果您使用的是 JSON 日志记录,现在就更容易了:

if stackErr, ok := err.(stackTracer); ok {
log.WithField("stacktrace", stackErr.StackTrace())
}

这将生成类似于“%+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
}
}

无需打印每一帧,您可以将其强制转换为您喜欢的任何格式。

关于go - 如何让 logrus 打印 pkg/errors 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54369295/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com