Files
phishingclub/backend/app/logger.go
2025-08-21 16:14:09 +02:00

77 lines
1.8 KiB
Go

package app
import (
"github.com/go-errors/errors"
"github.com/phishingclub/phishingclub/config"
"github.com/phishingclub/phishingclub/log"
"github.com/phishingclub/phishingclub/version"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
const (
MODE_INTEGRATION_TEST = "integration_test"
MODE_DEVELOPMENT = "development"
MODE_PRODUCTION = "production"
)
func createCore(core zapcore.Core) zapcore.Core {
return &stackCore{core}
}
type stackCore struct {
zapcore.Core
}
func (c *stackCore) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry {
// dont add our core again if it's already been added
if ce != nil {
return ce
}
return ce.AddCore(ent, c)
}
func (c *stackCore) Write(ent zapcore.Entry, fields []zapcore.Field) error {
// return c.Core.Write(ent, fields)
// look for error field and enhance the message with stack trace
for _, field := range fields {
if field.Key == "error" {
if err, ok := field.Interface.(error); ok {
if goErr, ok := err.(*errors.Error); ok {
ent.Stack = goErr.ErrorStack()
}
}
}
}
return c.Core.Write(ent, fields)
}
func SetupLogger(loggerType string, conf *config.Config) (*zap.SugaredLogger, *zap.AtomicLevel, error) {
var logger *zap.Logger
var loggerAtom *zap.AtomicLevel
var err error
switch loggerType {
case MODE_DEVELOPMENT:
logger, loggerAtom, err = log.NewDevelopmentLogger(conf)
case MODE_INTEGRATION_TEST:
fallthrough
case MODE_PRODUCTION:
fallthrough
default:
logger, loggerAtom, err = log.NewProductionLogger(conf)
}
if err != nil {
return nil, nil, err
}
// Create new logger with custom core
logger = zap.New(createCore(logger.Core()))
sgr := logger.Sugar()
if loggerType == MODE_PRODUCTION {
sgr = sgr.With("v-debug", version.Get())
}
return sgr, loggerAtom, nil
}