89 lines
1.5 KiB
Go
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)
|
|
}
|