2017-07-07 112 views
1

我一直在我的Python項目中使用Sentry,最近我開始使用Go和Beego框架開發一個項目,我需要爲我的項目中的bug報告配置Sentry。但在閱讀Beego文檔後,我無法找到正確的方法來做到這一點。如果您之前執行過此操作,請幫助我。在Beego中使用Sentry

回答

0

後的閱讀BeeGo和哨兵碼小時裏,我想通了,如何實現這一點:

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

    } 
} 
1

這可能是一個簡單的解決方案,而無需禁用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) 
     } 
    } 
}