80 lines
1.5 KiB
Go
80 lines
1.5 KiB
Go
package logger
|
|
|
|
// refs:
|
|
// https://josephwoodward.co.uk/2022/11/slog-structured-logging-proposal
|
|
// https://thedevelopercafe.com/articles/logging-in-go-with-slog-a7bb489755c2
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"golang.org/x/exp/slog"
|
|
)
|
|
|
|
type LogrusHandler struct {
|
|
logger *logrus.Logger
|
|
}
|
|
|
|
func NewLogrusHandler(logger *logrus.Logger) *LogrusHandler {
|
|
return &LogrusHandler{
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
func ConvertLogLevel(level string) logrus.Level {
|
|
var l logrus.Level
|
|
|
|
switch strings.ToLower(level) {
|
|
case "error":
|
|
l = logrus.ErrorLevel
|
|
case "warm":
|
|
l = logrus.WarnLevel
|
|
case "info":
|
|
l = logrus.InfoLevel
|
|
case "debug":
|
|
l = logrus.DebugLevel
|
|
default:
|
|
l = logrus.InfoLevel
|
|
}
|
|
|
|
return l
|
|
}
|
|
|
|
func (h *LogrusHandler) Enabled(_ slog.Level) bool {
|
|
// support all logging levels
|
|
return true
|
|
}
|
|
|
|
func (h *LogrusHandler) Handle(rec slog.Record) error {
|
|
fields := make(map[string]interface{}, rec.NumAttrs())
|
|
|
|
rec.Attrs(func(a slog.Attr) {
|
|
fields[a.Key] = a.Value.Any()
|
|
})
|
|
|
|
entry := h.logger.WithFields(fields)
|
|
|
|
switch rec.Level {
|
|
case slog.DebugLevel:
|
|
entry.Debug(rec.Message)
|
|
case slog.InfoLevel.Level():
|
|
entry.Info(rec.Message)
|
|
case slog.WarnLevel:
|
|
entry.Warn(rec.Message)
|
|
case slog.ErrorLevel:
|
|
entry.Error(rec.Message)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *LogrusHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
|
// not implemented for brevity
|
|
return h
|
|
}
|
|
|
|
func (h *LogrusHandler) WithGroup(name string) slog.Handler {
|
|
// not implemented for brevity
|
|
return h
|
|
}
|