使用 golang 做错误日志记录,应结合 logrus 和 pkg/errors 实现结构化日志与上下文信息记录。1. 使用 logrus 输出 json 格式日志并添加字段,便于日志系统解析;2. 用 pkg/errors 包装错误,保留堆栈和上下文;3. 结合两者记录错误时附带关键字段和可选堆栈;4. 统一错误处理逻辑、按需输出堆栈、结合 context 传递请求 id、避免重复记录日志,从而提升排查效率与系统可观测性。

用 Golang 做错误日志记录,很多人一开始可能只是简单地用标准库的 log 包打印一下信息。但随着项目变大、部署环境变多,你会发现仅仅输出“出错了”是远远不够的。我们需要更清晰的上下文、结构化的日志格式,以及方便后续排查的能力。

在实际开发中,logrus 是一个非常常用的第三方日志库,它支持结构化日志、设置日志级别、添加字段等功能。而结合 errors 包 或者像 pkg/errors 这样的错误包装工具,我们可以实现带上下文信息的错误日志记录,对定位问题帮助很大。

Golang 标准库的 log 包虽然简单易用,但输出的是纯文本,不利于日志收集系统解析。logrus 的优势在于它可以输出 JSON 格式日志,并且可以灵活添加字段。
立即学习“go语言免费学习笔记(深入)”;
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetFormatter(&logrus.JSONFormatter{}) // 设置为 JSON 格式输出
logrus.WithFields(logrus.Fields{
"user_id": 123,
"action": "login",
}).Error("failed to login")
}这样输出的日志会包含字段信息,比如:

{
"action": "login",
"level": "error",
"msg": "failed to login",
"time": "2024-06-10T12:00:00Z",
"user_id": 123
}这对后期日志分析平台(如 ELK、Loki)来说非常友好。
单纯记录错误信息往往不够,我们还需要知道错误发生的调用栈、具体上下文等信息。这时候可以用 pkg/errors 来包装错误。
import (
"github.com/pkg/errors"
)
func doSomething() error {
return errors.New("something went wrong")
}
func callSomething() error {
err := doSomething()
if err != nil {
return errors.Wrap(err, "callSomething failed")
}
return nil
}上面的例子中,Wrap 方法会在原有错误的基础上加上新的描述,同时保留原始错误和堆栈信息。你可以通过 errors.Cause() 获取最底层的错误原因,也可以用 %+v 打印完整的堆栈。
将两者结合起来,可以在记录错误时不仅输出错误信息,还能带上上下文字段,甚至堆栈信息。
err := callSomething()
if err != nil {
logrus.WithFields(logrus.Fields{
"error": err.Error(),
"stack": fmt.Sprintf("%+v", err), // 输出完整堆栈
"user_id": 456,
}).Error("an error occurred during processing")
}如果你希望保持日志简洁,也可以只记录关键字段和错误信息,把堆栈信息作为可选内容存储起来备用。
小贴士:如果你不想每次都手动加 error 和 stack 字段,可以封装一个统一的错误日志函数。日志中不要记录敏感信息,比如密码、token 等。可以根据日志级别控制是否输出堆栈信息(例如 debug 级别才输出 stack)。
在实际项目中,有几点经验值得分享:
LogError(logger *logrus.Entry, err error) 函数来集中处理错误日志的记录方式。基本上就这些了。用好 logrus 和错误包装工具,能让你在排查线上问题时轻松不少。结构化日志 + 上下文信息,是构建可观测性系统的基础之一。
以上就是如何用Golang进行错误日志记录 分享logrus与错误上下文结合实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号