65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package splinter
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"time"
|
|
)
|
|
|
|
// Level mirrors slog.Level so callers don't need to import slog directly.
|
|
type Level = slog.Level
|
|
|
|
const (
|
|
LevelDebug Level = slog.LevelDebug
|
|
LevelInfo Level = slog.LevelInfo
|
|
LevelWarn Level = slog.LevelWarn
|
|
LevelError Level = slog.LevelError
|
|
)
|
|
|
|
// LevelFromString parses a level name (case-insensitive). Accepted:
|
|
// "debug", "info", "warn"/"warning", "error". Unknown input returns LevelInfo.
|
|
func LevelFromString(s string) Level {
|
|
var l slog.Level
|
|
if err := l.UnmarshalText([]byte(s)); err != nil {
|
|
return LevelInfo
|
|
}
|
|
return l
|
|
}
|
|
|
|
// Record is a self-contained log entry passed to every Stream.
|
|
type Record struct {
|
|
Time time.Time
|
|
Level Level
|
|
Message string
|
|
Attrs map[string]any
|
|
}
|
|
|
|
// LevelLabel returns a human-friendly label for the record's level.
|
|
func (r Record) LevelLabel() string {
|
|
switch {
|
|
case r.Level < LevelInfo:
|
|
return "DEBUG"
|
|
case r.Level < LevelWarn:
|
|
return "INFO"
|
|
case r.Level < LevelError:
|
|
return "WARN"
|
|
default:
|
|
return "ERROR"
|
|
}
|
|
}
|
|
|
|
// Stream is the abstraction for a log output destination.
|
|
type Stream interface {
|
|
// Name returns a short identifier used in error reporting (e.g. "console").
|
|
Name() string
|
|
|
|
// Write handles a single record. Implementations must be safe for
|
|
// concurrent use.
|
|
Write(ctx context.Context, rec Record) error
|
|
|
|
// Enabled reports whether the stream cares about the given level.
|
|
Enabled(level Level) bool
|
|
|
|
// Close flushes and releases any resources. Called once by Logger.Close.
|
|
Close() error
|
|
}
|