简体   繁体   中英

How to use Sentry with go.uber.org/zap/zapcore logger

I am using go.uber.org/zap/zapcore for logging in my Go app.

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
}

I also have Sentry project and use github.com/getsentry/raven-go .

I want to send logs at error level and above to Sentry.

For example when logging at info level with logger.Info() I want to just log them as usual, but in case of error or fatal logs I need send these messages to Sentry. How can I achieve that?

The answer is you should use zap wrapper for adding hooks then you have to use the function of logger which is called WithOptions

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

logger.WithOptions(sentryOptions)

The following will capture the message and send it to the sentry when an error level is detected, with customized error line number and message.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM