~xenrox/go-utils

959a68fe51dec8ef764baa0e8d978371609a42e3 — Thorben Günther 9 months ago 897165f
logging: Add function to create new logger

This allows to specify the logging format as well.
1 files changed, 28 insertions(+), 4 deletions(-)

M logging/logging.go
M logging/logging.go => logging/logging.go +28 -4
@@ 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)
	}
}