Files
kurious/internal/common/config/log.go
2023-11-30 00:39:51 +03:00

89 lines
1.5 KiB
Go

package config
import (
"bytes"
"log/slog"
"os"
"git.loyso.art/frx/kurious/internal/common/errors"
)
type LogFormat uint8
const (
LogFormatText LogFormat = iota
LogFormatJSON
)
func (f *LogFormat) UnmarshalText(data []byte) error {
switch format := string(bytes.ToLower(data)); format {
case "json":
*f = LogFormatJSON
case "text":
*f = LogFormatText
default:
return errors.NewValidationError("format", "unsupported value "+format)
}
return nil
}
type LogLevel uint8
const (
LogLevelDebug LogLevel = iota
LogLevelInfo
LogLevelWarn
LogLevelError
)
func (lvl *LogLevel) UnmarshalText(data []byte) error {
switch level := string(bytes.ToLower(data)); level {
case "debug", "":
*lvl = LogLevelDebug
case "info":
*lvl = LogLevelInfo
case "warn":
*lvl = LogLevelWarn
case "error":
*lvl = LogLevelError
default:
return errors.NewValidationError("level", "unsupported value "+level)
}
return nil
}
type Log struct {
Level LogLevel `json:"level"`
Format LogFormat `json:"format"`
}
func NewSLogger(config Log) *slog.Logger {
var level slog.Level
switch config.Level {
case LogLevelDebug:
level = slog.LevelDebug
case LogLevelInfo:
level = slog.LevelInfo
case LogLevelWarn:
level = slog.LevelWarn
case LogLevelError:
level = slog.LevelError
}
opts := &slog.HandlerOptions{
Level: level,
}
var h slog.Handler
switch config.Format {
case LogFormatJSON:
h = slog.NewJSONHandler(os.Stdout, opts)
case LogFormatText:
h = slog.NewTextHandler(os.Stdout, opts)
}
return slog.New(h)
}