Files
ez-api/internal/logging/logging.go
zenfun 89cb74ba6e refactor(log): migrate from zerolog to structured slog with bridge
- Replace direct zerolog usage with standard library `log/slog` in business code
- Add `internal/logging` package with zerolog bridge handler for structured output
- Create `internal/jsoncodec` package to centralize JSON encoding/decoding using Sonic
- Update all services and main entry point to use new logging interface
- Maintain backward compatibility with existing zerolog console output
- Remove custom logger setup in favor of structured logging bridge
2025-12-13 16:50:56 +08:00

64 lines
1.2 KiB
Go

package logging
import (
"log/slog"
"os"
"strings"
"time"
"github.com/rs/zerolog"
)
type Options struct {
Service string
}
func New(opts Options) (*slog.Logger, zerolog.Logger) {
level := parseLevel(strings.TrimSpace(os.Getenv("EZ_LOG_LEVEL")))
zerolog.SetGlobalLevel(toZerologLevel(level))
output := zerolog.ConsoleWriter{
Out: os.Stdout,
TimeFormat: time.RFC3339,
}
zl := zerolog.New(output).
Level(toZerologLevel(level)).
With().
Timestamp().
Str("service", strings.TrimSpace(opts.Service)).
Logger()
sl := slog.New(NewZerologHandler(zl, level))
slog.SetDefault(sl)
return sl, zl
}
func parseLevel(raw string) slog.Level {
switch strings.ToLower(raw) {
case "debug":
return slog.LevelDebug
case "warn", "warning":
return slog.LevelWarn
case "error":
return slog.LevelError
case "info", "":
return slog.LevelInfo
default:
return slog.LevelInfo
}
}
func toZerologLevel(level slog.Level) zerolog.Level {
switch {
case level <= slog.LevelDebug:
return zerolog.DebugLevel
case level <= slog.LevelInfo:
return zerolog.InfoLevel
case level <= slog.LevelWarn:
return zerolog.WarnLevel
default:
return zerolog.ErrorLevel
}
}