@@ 5,18 5,22 @@ package logging
import (
"errors"
"fmt"
+ "io"
"log/slog"
"strings"
)
// ErrInvalidLevel is returned when no valid logging level can be parsed by
-// ParseLevelFromString.
-var ErrInvalidLevel = errors.New("cannot parse logging level from string")
+// ParseLevel.
+var ErrInvalidLevel = errors.New("cannot parse logging level")
-// ParseLevelFromString parses the level from a string and returns it. If it
+// ErrInvalidFormat is returned when no valid logging format can be parsed.
+var ErrInvalidFormat = errors.New("cannot parse logging format")
+
+// ParseLevel parses the level from a string and returns it. If it
// cannot parse a legitimate level from the level string, it will return
// ErrInvalidLevel.
-func ParseLevelFromString(level string) (slog.Level, error) {
+func ParseLevel(level string) (slog.Level, error) {
switch strings.ToLower(level) {
case "error":
return slog.LevelError, nil
@@ 30,3 34,23 @@ func ParseLevelFromString(level string) (slog.Level, error) {
return slog.LevelInfo, fmt.Errorf("%w: %s", ErrInvalidLevel, level)
}
}
+
+// New creates a new *slog.Logger with the specified level, format and writes
+// to w.
+func New(level string, format string, w io.Writer) (*slog.Logger, error) {
+ logLevel, err := ParseLevel(level)
+ if err != nil {
+ return nil, err
+ }
+
+ opts := &slog.HandlerOptions{Level: logLevel}
+
+ switch strings.ToLower(format) {
+ case "text":
+ return slog.New(slog.NewTextHandler(w, opts)), nil
+ case "json":
+ return slog.New(slog.NewJSONHandler(w, opts)), nil
+ default:
+ return nil, fmt.Errorf("%w: %s", ErrInvalidFormat, format)
+ }
+}