将 Sentry 与 Beego 结合使用
Use Sentry with Beego
我一直在使用 Sentry in my Python projects, recently I started a project with Go and Beego framework and I need to configure Sentry 来报告我的项目中的错误。但是在阅读了 Beego 文档后,我找不到合适的方法来做这件事。如果你以前实现过这个,请帮助我。
在阅读 BeeGo 和 Sentry 代码数小时后,我想出了如何实现它:
package main
import (
"errors"
"fmt"
"net/http"
"runtime"
"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
"github.com/getsentry/raven-go"
)
func init() {
raven.SetDSN(beego.AppConfig.String("SentryDSN"))
if !beego.BConfig.RecoverPanic {
beego.BConfig.RecoverFunc = recoverPanic
}
}
func recoverPanic(ctx *context.Context) {
if err := recover(); err != nil {
if err == beego.ErrAbort {
return
}
if !beego.BConfig.RecoverPanic {
errStr := fmt.Sprint(err)
packet := raven.NewPacket(errStr, raven.NewException(errors.New(errStr), raven.NewStacktrace(2, 3, nil)), raven.NewHttp(ctx.Request))
raven.Capture(packet, nil)
ctx.ResponseWriter.WriteHeader(http.StatusInternalServerError)
}
//if beego.BConfig.EnableErrorsShow {
// if _, ok := beego.ErrorMaps[fmt.Sprint(err)]; ok {
// exception(fmt.Sprint(err), ctx)
// return
// }
//}
var stack string
logs.Critical("the request url is ", ctx.Input.URL())
logs.Critical("Handler crashed with error", err)
for i := 1; ; i++ {
_, file, line, ok := runtime.Caller(i)
if !ok {
break
}
logs.Critical(fmt.Sprintf("%s:%d", file, line))
stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line))
}
//if beego.BConfig.RunMode == beego.DEV && beego.BConfig.EnableErrorsRender {
// showErr(err, ctx, stack)
//}
}
}
这可能是一个简单的解决方案,无需禁用 beego 原始恢复功能:
func initRecover() {
originRecover := beego.BConfig.RecoverFunc
beego.BConfig.RecoverFunc = func(ctx *context.Context) {
defer originRecover(ctx)
if err := recover(); err != nil {
//*** your reporting code here. ***
panic(err)
}
}
}
我一直在使用 Sentry in my Python projects, recently I started a project with Go and Beego framework and I need to configure Sentry 来报告我的项目中的错误。但是在阅读了 Beego 文档后,我找不到合适的方法来做这件事。如果你以前实现过这个,请帮助我。
在阅读 BeeGo 和 Sentry 代码数小时后,我想出了如何实现它:
package main
import (
"errors"
"fmt"
"net/http"
"runtime"
"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/logs"
"github.com/getsentry/raven-go"
)
func init() {
raven.SetDSN(beego.AppConfig.String("SentryDSN"))
if !beego.BConfig.RecoverPanic {
beego.BConfig.RecoverFunc = recoverPanic
}
}
func recoverPanic(ctx *context.Context) {
if err := recover(); err != nil {
if err == beego.ErrAbort {
return
}
if !beego.BConfig.RecoverPanic {
errStr := fmt.Sprint(err)
packet := raven.NewPacket(errStr, raven.NewException(errors.New(errStr), raven.NewStacktrace(2, 3, nil)), raven.NewHttp(ctx.Request))
raven.Capture(packet, nil)
ctx.ResponseWriter.WriteHeader(http.StatusInternalServerError)
}
//if beego.BConfig.EnableErrorsShow {
// if _, ok := beego.ErrorMaps[fmt.Sprint(err)]; ok {
// exception(fmt.Sprint(err), ctx)
// return
// }
//}
var stack string
logs.Critical("the request url is ", ctx.Input.URL())
logs.Critical("Handler crashed with error", err)
for i := 1; ; i++ {
_, file, line, ok := runtime.Caller(i)
if !ok {
break
}
logs.Critical(fmt.Sprintf("%s:%d", file, line))
stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line))
}
//if beego.BConfig.RunMode == beego.DEV && beego.BConfig.EnableErrorsRender {
// showErr(err, ctx, stack)
//}
}
}
这可能是一个简单的解决方案,无需禁用 beego 原始恢复功能:
func initRecover() {
originRecover := beego.BConfig.RecoverFunc
beego.BConfig.RecoverFunc = func(ctx *context.Context) {
defer originRecover(ctx)
if err := recover(); err != nil {
//*** your reporting code here. ***
panic(err)
}
}
}