package logger import ( "log/slog" "os" ) type LogService interface { Error(msg string, args ...any) Info(msg string, args ...any) } type loggers struct { infoLogger *slog.Logger errorLogger *slog.Logger } func SetupLogger(env string) (LogService, error) { var infoHandler slog.Handler var errorHandler slog.Handler if env == "test" { infoHandler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}) errorHandler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelError}) } else { err := os.MkdirAll("logs", 0755) if err != nil { return nil, err } infoFile, err := os.OpenFile("logs/Info.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { if os.IsNotExist(err) { infoFile, err = os.Create("logs/Info.log") if err != nil { return nil, err } } else { return nil, err } } errorFile, err := os.OpenFile("logs/Error.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { infoFile.Close() if os.IsNotExist(err) { errorFile, err = os.Create("logs/Error.log") if err != nil { return nil, err } } else { return nil, err } } infoHandler = slog.NewTextHandler(infoFile, &slog.HandlerOptions{Level: slog.LevelInfo}) errorHandler = slog.NewTextHandler(errorFile, &slog.HandlerOptions{Level: slog.LevelError}) } infoLogger := slog.New(infoHandler) errorLogger := slog.New(errorHandler) return &loggers{ infoLogger: infoLogger, errorLogger: errorLogger, }, nil } func (l *loggers) Error(msg string, args ...any) { l.errorLogger.Error(msg, args...) } func (l *loggers) Info(msg string, args ...any) { l.infoLogger.Info(msg, args...) }