package log import ( "git.0x7f.app/WOJ/woj-server/internal/misc/config" "git.0x7f.app/WOJ/woj-server/pkg/utils" "github.com/TheZeroSlave/zapsentry" "github.com/getsentry/sentry-go" "github.com/samber/do" "go.uber.org/zap" "go.uber.org/zap/zapcore" "log" ) var _ Service = (*service)(nil) type Service interface { GetRawLogger() *zap.Logger GetLogger(domain string) *zap.Logger HealthCheck() error } func NewService(i *do.Injector) (Service, error) { srv := &service{} srv.confService = do.MustInvoke[config.Service](i) c := srv.confService.GetConfig() cfg := zap.Config{ Level: zap.NewAtomicLevelAt(utils.If( c.Development, zapcore.DebugLevel, zapcore.InfoLevel, )), Development: c.Development, Encoding: "console", // or json EncoderConfig: utils.If( c.Development, zap.NewDevelopmentEncoderConfig(), zap.NewProductionEncoderConfig(), ), OutputPaths: []string{"stdout"}, ErrorOutputPaths: []string{"stderr"}, } var err error srv.logger, err = cfg.Build() if err != nil { log.Printf("Failed to setup Zap: %s\n", err.Error()) return nil, err } srv.logger = attachSentry(srv.logger) return srv, nil } func attachSentry(log *zap.Logger) *zap.Logger { cfg := zapsentry.Configuration{ Level: zapcore.ErrorLevel, EnableBreadcrumbs: true, BreadcrumbLevel: zapcore.InfoLevel, } core, err := zapsentry.NewCore(cfg, zapsentry.NewSentryClientFromClient(sentry.CurrentHub().Client())) if err != nil { log.Warn("failed to init zap", zap.Error(err)) return log } log = zapsentry.AttachCoreToLogger(core, log) return log.With(zapsentry.NewScope()) } type service struct { confService config.Service logger *zap.Logger } func (s *service) GetRawLogger() *zap.Logger { return s.logger } func (s *service) GetLogger(domain string) *zap.Logger { return s.logger.Named(domain) } func (s *service) HealthCheck() error { return nil }