在开发Go应用程序时,错误处理和日志记录是至关重要的任务。堆栈跟踪信息能帮助我们追踪到错误的源头,但是在默认设置下,Go的错误日志(包括堆栈跟踪)会被打印在一行,这使得日志难以阅读。本文将指导介绍如何让Go的错误日志分多行显示,以改善可读性,类似于Java的错误堆栈跟踪。
自定义logrus日志格式
logrus库允许我们自定义日志格式。我们可以创建一个自定义的日志格式(Formatter),在这个格式中,我们可以将每一个堆栈帧打印在新的一行。
首先,我们定义一个新的
Formatter
结构体,并实现
logrus.Formatter
接口的
Format
方法。在这个方法中,我们首先将日志条目的基本信息(时间、级别、消息)打印出来,然后检查
error
字段,如果这个字段存在,并且其值是一个
error
类型,我们就打印出这个错误的堆栈信息。
package main
import (
"fmt"
"strings"
"time"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
type CustomFormatter struct{}
func (f *CustomFormatter) Format(entry *logrus.Entry) ([]byte, error) {
// Start with the standard log entry format: time, level, message.
output := fmt.Sprintf("%s [%s] %s\n", entry.Time.Format(time.RFC3339), strings.ToUpper(entry.Level.String()), entry.Message)
// If this log entry has an error field and it's an error, print its stack trace.
if err, ok := entry.Data[logrus.ErrorKey].(error); ok {
output += fmt.Sprintf("%+v\n", err)
return []byte(output), nil
func main() {
logrus.SetFormatter(new(CustomFormatter))
err := errors.Wrap(errors.New("this is an error"), "error occurred")
if err != nil {
logrus.Errorf("something wrong: %+v", err)
}
运行这段代码,你会看到以下输出:
2023-07-10T12:55:47+08:00 [ERROR] something wrong: this is an error
main.main
d:/src/golang/demo/errdemo/main.go:28
runtime.main
C:/Program Files/Go/src/runtime/proc.go:255
runtime.goexit
C:/Program Files/Go/src/runtime/asm_amd64.s:1581
error occurred
main.main