gomcp/internal/infrastructure/logging/logger.go

57 lines
1.4 KiB
Go

// Package logging provides structured logging via Go's log/slog.
// Production: JSON output. Development: text output with colors.
//
// Usage:
//
// logger := logging.New("json", "info") // production
// logger := logging.New("text", "debug") // development
// logger.Info("event ingested", "event_id", id, "source", src)
package logging
import (
"io"
"log/slog"
"os"
"strings"
)
// New creates a structured logger.
// format: "json" (production) or "text" (development).
// level: "debug", "info", "warn", "error".
func New(format, level string) *slog.Logger {
return NewWithOutput(format, level, os.Stdout)
}
// NewWithOutput creates a logger writing to the given writer.
func NewWithOutput(format, level string, w io.Writer) *slog.Logger {
lvl := parseLevel(level)
opts := &slog.HandlerOptions{Level: lvl}
var handler slog.Handler
switch strings.ToLower(format) {
case "json":
handler = slog.NewJSONHandler(w, opts)
default:
handler = slog.NewTextHandler(w, opts)
}
return slog.New(handler)
}
// WithComponent returns a logger with a "component" attribute.
func WithComponent(logger *slog.Logger, component string) *slog.Logger {
return logger.With("component", component)
}
func parseLevel(s string) slog.Level {
switch strings.ToLower(s) {
case "debug":
return slog.LevelDebug
case "warn", "warning":
return slog.LevelWarn
case "error":
return slog.LevelError
default:
return slog.LevelInfo
}
}