gpt4 book ai didi

go - 记录未处理的Golang panic

转载 作者:行者123 更新时间:2023-12-01 20:22:29 24 4
gpt4 key购买 nike

我的Golang应用程序中有一个logrus日志处理程序。日志使用JSONFormatter格式化,并作为一行提交给Datadog,Datadog对其进行汇总并很好地显示它们。但是,我最近发现了一个 Unresolved panic 的情况,而logrus记录器未捕获到这种情况。这导致实际的 panic 和堆栈跟踪分布在多条输出线上,Datadog会分别收集它们。这使我们付出了金钱,并使日志非常难以阅读。

我将解决此问题,但是如果发生任何其他 Unresolved panic 事件,我希望能够使用logrus JSONFormatter捕获它们。

像这样:

package main

import (
"os"
"sync"

"github.com/sirupsen/logrus"
)

var (
loggerInstance *logrus.Entry
once sync.Once
logger = GetLogger()
)

// GetLogger initializes and returns a reference to a CustomLogger object.
func GetLogger() *logrus.Entry {
once.Do(func() {
logrus.SetFormatter(&logrus.JSONFormatter{})

// We'll just pipe everything to stdout. It's json so Datadog will parse the level regardless
logrus.SetOutput(os.Stdout)
logrus.SetLevel(logrus.TraceLevel) // We'll leave this as trace and just filter out logs when we index them
loggerInstance = logrus.WithFields(logrus.Fields{"env": "local"}) // Add env tag for easy log parsing
})
return loggerInstance
}

func main() {
logger.Info("Logrus using json logging")
logger.Warn("We are about to panic")

var things = []string{
"hi",
"yes",
"thing"}

print("%s", things[len(things)])
}

这将产生以下输出。如您所见,前两个日志使用logrus,但未处理的 panic 不使用。
{"env":"local","level":"info","msg":"Logrus using json logging","time":"2020-03-03T15:12:30-08:00"}
{"env":"local","level":"warning","msg":"We are about to panic","time":"2020-03-03T15:12:30-08:00"}
panic: runtime error: index out of range

goroutine 1 [running]:
main.main()
/Users/nathan.deren/Library/Preferences/GoLand2019.3/scratches/scratch.go:38 +0xbe

Process finished with exit code 2

是否可以使用logrus记录最后几行?

最佳答案

尝试recover捕获所有 panic 并记录下来。否则,它将把紧急消息msg写入stderr:

func main() {
defer func() {
if r := recover(); r != nil {
logger.Errorf("Panic: %v", r)
os.Exit(1)
}
}()
// rest of main here
}

关于go - 记录未处理的Golang panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60516923/

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