【问题标题】:Iris - How to log erros/exceptions?Iris - 如何记录错误/异常?
【发布时间】:2016-08-17 08:33:24
【问题描述】:

我正在使用 Iris 测试 Go 应用程序。 我想将每个错误或异常记录到我的 Rollbar 帐户。

例如,如果端点响应时间过长并且超时,我想记录它。我怎样才能捕捉到这样的错误?

更新

我在文档中找到了OnError 方法,我想我可以这样使用它:

iris.OnError(iris.StatusServiceUnavailable, func(c *iris.Context) {
    c.Write("503")
    params := string(c.RequestCtx.Request.Body())
    rollbar.Error("error", errors.New("503 Service Unavailable"), &rollbar.Field{Name: "request_body", Data: params})
})

但它没有将错误记录到 Rollbar。

【问题讨论】:

    标签: go


    【解决方案1】:

    您需要编写自己的iris middleware

    应该是这样的:

    func irisMiddlewareFunc(ctx *iris.Context) {
        startedAt := time.Now()
        ctx.Next()
        timeTaken := time.Since(startedAt)
    
        // now check time taken and log as required
        if timeTaken.Seconds() > 2 {
            fmt.Println("Taken too long")
        }
    }
    

    你这样使用它:

        iris.UseFunc(irisMiddlewareFunc)
    

    如果您还需要处理恐慌,只需像处理恐慌一样使用 recover() 即可。示例见github.com/iris-contrib/middleware/recovery

    【讨论】:

    • 这看起来很有趣。但不应该是 Next() 这个函数的最后一次调用吗?
    • 没有。简单来说,Next() 调用处理链中的下一个处理程序(最后一个将是请求的处理程序)。他们称之为链式,但我宁愿建议把它们想象成俄罗斯娃娃而不是链子。如果您将 Next() 调用移至固件末尾,那么您的所有测量和记录都将在调用处理程序之前发生。
    • 另一个例子是 github.com/iris-contrib/middleware/logger。看一下 Serve() 方法。
    • 明白,谢谢!我更新了我的问题,您知道为什么该解决方案不起作用吗?
    • 我不确定。我不在我的代码中使用 OnError() 。首先,仅当您自己的处理程序设置该响应状态(例如 503)时,才会调用 OnError()。 503 很可能是由负载均衡器或代理生成的,而没有实际访问您的服务。如果您在自己的代码中设置了 503 状态,请检查是否在 iris.Get() 之前调用了 iris.onError()。我不确定这是否重要,但我怀疑它是。见kataras.gitbooks.io/iris/content/custom-http-errors.html。请注意 iris.onError() 调用是如何在 iris.Get() 调用之前进行的。
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2010-11-19
    • 2011-11-25
    • 1970-01-01
    • 2014-02-28
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多