woj-server/internal/misc/log/zap.go

92 lines
2.0 KiB
Go
Raw Permalink Normal View History

2023-07-15 16:19:49 +08:00
package log
import (
2023-12-20 23:45:53 +08:00
"git.0x7f.app/WOJ/woj-server/cmd"
2023-07-15 16:19:49 +08:00
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
"git.0x7f.app/WOJ/woj-server/pkg/utils"
2023-07-20 11:39:14 +08:00
"github.com/TheZeroSlave/zapsentry"
"github.com/getsentry/sentry-go"
2023-07-15 16:19:49 +08:00
"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
}
2023-12-20 23:45:53 +08:00
if cmd.SentryDSN != "" {
srv.logger = attachSentry(srv.logger)
}
2023-07-20 11:39:14 +08:00
2023-07-15 16:19:49 +08:00
return srv, nil
}
2023-07-20 11:39:14 +08:00
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())
}
2023-07-15 16:19:49 +08:00
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
}