url-shortener/pkg/logger/logrus_adaptor.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
}