1

go.uber.org/zap/zapcore用于登录我的 Go 应用程序。

package logger

import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "log"
)

var l *zap.Logger

func Get() *zap.Logger {
    return l
}

func Init() {
    conf := zap.NewProductionConfig()

    logger, err := conf.Build()
    if err != nil {
        log.Fatal("Init logger failed", err)
    }
    l = logger
}

我也有 Sentry 项目并使用github.com/getsentry/raven-go.

我想将error级别及以上的日志发送到 Sentry。

例如,当在info级别登录时,logger.Info()我只想像往常一样记录它们,但如果是errorfatal记录,我需要将这些消息发送到 Sentry。我怎样才能做到这一点?

4

2 回答 2

1

答案是你应该使用 zap 包装器来添加钩子,然后你必须使用名为 WithOptions 的 logger 函数

sentryOptions := zap.WrapCore(func(core zapcore.Core) zapcore.Core {
    return zapcore.RegisterHooks(core, func(entry zapcore.Entry) error {
        // your logic here
    })
})

logger.WithOptions(sentryOptions)
于 2020-11-12T15:38:49.927 回答
1

当检测到错误级别时,以下将捕获消息并将其发送到哨兵,并带有自定义的错误行号和消息。

err := sentry.Init(sentry.ClientOptions{Dsn: "http://~~~~~"})
if err != nil {
    log.fatal("Sentry Error Setup ::", err.Error())
}

logger, _ := zap.NewDevelopment(zap.Hooks(func(entry zapcore.Entry) error {
    if entry.Level == zapcore.ErrorLevel {
        defer sentry.Flush(2 * time.Second)
        sentry.CaptureMessage(fmt.Sprintf("%s, Line No: %d :: %s", entry.Caller.File, entry.Caller.Line, entry.Message))
    }
    return nil
}))

sugar := logger.Sugar()
于 2021-06-07T15:23:51.763 回答