使用Sentry与Beego

huangapple go评论82阅读模式
英文:

Use Sentry with Beego

问题

我在我的Python项目中使用了Sentry,最近我开始了一个使用Go和Beego框架的项目,我需要为我的项目配置Sentry以进行错误报告。但是在阅读Beego文档后,我没有找到一个合适的方法来实现。如果你之前实现过这个,请帮助我。

英文:

I've been using Sentry in my Python projects, recently I started a project with Go and Beego framework and I need to configure Sentry for bug reports in my project. But after reading Beego documentation I couldn't find a proper way to do it. Please help me if you implemented this before.

答案1

得分: 2

这可能是一个简单的解决方案,而不是禁用beego原始的恢复函数:

func initRecover() {
    originRecover := beego.BConfig.RecoverFunc
    beego.BConfig.RecoverFunc = func(ctx *context.Context) {
        defer originRecover(ctx)
        if err := recover(); err != nil {
            //*** 在这里添加你的报告代码。 ***
            panic(err)
        }
    }
}

这段代码可以实现在不禁用beego原始恢复函数的情况下,对恢复过程进行修改。

英文:

This might be a simple solution, without disabling beego original recover function:

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)
		}
	}
}

答案2

得分: 0

在阅读了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)
		//}
	}
}
英文:

After hours of reading BeeGo and Sentry codes I figured out how to implement this:

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)
//}
}
}

huangapple
  • 本文由 发表于 2017年7月7日 09:43:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/44961304.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定