package logging import ( "context" "log/slog" "os" ) var Logger *slog.Logger type MultiHandler struct { handlers []slog.Handler } func (m *MultiHandler) Enabled(ctx context.Context, level slog.Level) bool { for _, h := range m.handlers { if h.Enabled(ctx, level) { return true } } return false } func (m *MultiHandler) Handle(ctx context.Context, record slog.Record) error { for _, h := range m.handlers { _ = h.Handle(ctx, record) } return nil } func (m *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler { newHandlers := make([]slog.Handler, len(m.handlers)) for i, h := range m.handlers { newHandlers[i] = h.WithAttrs(attrs) } return &MultiHandler{handlers: newHandlers} } func (m *MultiHandler) WithGroup(name string) slog.Handler { newHandlers := make([]slog.Handler, len(m.handlers)) for i, h := range m.handlers { newHandlers[i] = h.WithGroup(name) } return &MultiHandler{handlers: newHandlers} } func InitLogger() { logFile, err := os.OpenFile("../angel_api-server.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { slog.Default().Error("Error opening log file", "error", err) return } fileHandler := slog.NewJSONHandler(logFile, &slog.HandlerOptions{Level: slog.LevelDebug}) consoleHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug}) multiHandler := &MultiHandler{handlers: []slog.Handler{fileHandler, consoleHandler}} Logger = slog.New(multiHandler) slog.SetDefault(Logger) } func GetLogger() *slog.Logger { if Logger == nil { InitLogger() } return Logger }