89 lines
1.9 KiB
Go
89 lines
1.9 KiB
Go
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
|
|
}
|