package log import ( "log/slog" "os" slogmulti "github.com/samber/slog-multi" "go.uber.org/fx" "payouts/internal/config" ) var Module = fx.Options( fx.Provide(NewLogger), ) // Params represents the module input params type Params struct { fx.In AppConfig *config.App } func NewLogger(p Params) (*slog.Logger, error) { logConfig := p.AppConfig.Log opts := &slog.HandlerOptions{ Level: logConfig.Level, } handlers := []slog.Handler{} if logConfig.StdoutEnabled { if logConfig.TextOutput { handlers = append(handlers, slog.NewTextHandler(os.Stdout, opts)) } else { handlers = append(handlers, slog.NewJSONHandler(os.Stdout, opts)) } } if logConfig.FileEnabled { file, err := os.OpenFile(logConfig.FilePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) if err != nil { return nil, err } if logConfig.TextOutput { handlers = append(handlers, slog.NewTextHandler(file, opts)) } else { handlers = append(handlers, slog.NewJSONHandler(file, opts)) } } logger := slog.New(slogmulti.Fanout(handlers...)) slog.SetDefault(logger) return logger, nil }