簡體   English   中英

如何在 go.uber.org/zap/zapcore logger 中使用 Sentry

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

我正在使用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
}

我也有哨兵項目並使用github.com/getsentry/raven-go

我想將error級別及更高級別的日志發送到 Sentry。

例如,當使用logger.Info()info級別登錄時,我只想像往常一樣記錄它們,但是如果出現errorfatal日志,我需要將這些消息發送給 Sentry。 我怎樣才能做到這一點?

答案是你應該使用 zap 包裝器來添加鈎子,然后你必須使用名為 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)

下面將捕獲消息並在檢測到錯誤級別時將其發送給哨兵,並帶有自定義的錯誤行號和消息。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM