https://docs.sentry.io/platforms/go/

zap初期化時に、Hookを登録することができる。 zapcore.Entryを引数に取るので、そこからメッセージやログレベルを取得してやればよい

import (
	"fmt"
	"strings"
	"time"
 
	"github.com/aws/aws-lambda-go/events"
	"github.com/getsentry/sentry-go"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)
 
func NewLogger(levelStr string) (*zap.Logger, error) {
	level := parseLogLevel(levelStr)
	config := zap.Config{
		Level: zap.NewAtomicLevelAt(level),
	}
 
	// 環境変数SENTRY_DSNを設定するか、ClientOptionsに設定する
	err := sentry.Init(sentry.ClientOptions{})
	if err != nil {
		fmt.Printf("sentry.Init: %s", err)
	}
 
	return config.Build(zap.Hooks(func(entry zapcore.Entry) error {
		if entry.Level == zapcore.ErrorLevel {
			defer sentry.Flush(2 * time.Second)
			ev := sentry.NewEvent()
			ev.Level = sentry.LevelError
			ev.Message = entry.Message
			sentry.CaptureEvent(ev)
		}
		return nil
	}))
}
 
func parseLogLevel(levelStr string) zapcore.Level {
	switch strings.ToUpper(levelStr) {
	case zapcore.DebugLevel.CapitalString():
		return zapcore.DebugLevel
	case zapcore.InfoLevel.CapitalString():
		return zapcore.InfoLevel
	case zapcore.WarnLevel.CapitalString():
		return zapcore.WarnLevel
	case zapcore.ErrorLevel.CapitalString():
		return zapcore.ErrorLevel
	default:
		return zapcore.InfoLevel
	}
}
 

logging - How to use Sentry with go.uber.org/zap/zapcore logger - Stack Overflow [Go]Sentryに対応したcustom errorの作り方