83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
package sender
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
)
|
|
|
|
// InfraLoggerHandler adapts infra's log.Logger to an slog.Handler
|
|
type InfraLoggerHandler struct {
|
|
infraLogger log.Logger
|
|
}
|
|
|
|
type SlogAdapter struct {
|
|
logger *slog.Logger
|
|
}
|
|
|
|
// Log implements the Log method to satisfy the log.Logger interface.
|
|
func (s *SlogAdapter) Log(keyvals ...interface{}) error {
|
|
msg := ""
|
|
args := []interface{}{}
|
|
|
|
// Extract message and attributes (customize as needed).
|
|
if len(keyvals) > 0 {
|
|
msg, _ = keyvals[0].(string)
|
|
if len(keyvals) > 1 {
|
|
args = keyvals[1:]
|
|
}
|
|
}
|
|
|
|
// Delegate to slog.Logger
|
|
s.logger.Info(msg, args...)
|
|
return nil
|
|
}
|
|
|
|
// Enabled determines if the log level is enabled
|
|
func (h *InfraLoggerHandler) Enabled(_ context.Context, level slog.Level) bool {
|
|
// Assume all levels are enabled; customize this based on infra's log.Logger
|
|
return true
|
|
}
|
|
|
|
// Handle processes a log record and routes it to infra's log.Logger
|
|
func (h *InfraLoggerHandler) Handle(_ context.Context, record slog.Record) error {
|
|
// Build the log message
|
|
msg := record.Message
|
|
args := []interface{}{}
|
|
record.Attrs(func(a slog.Attr) bool {
|
|
args = append(args, a.Key, a.Value.Any())
|
|
return true
|
|
})
|
|
|
|
// Route the log message to Infra's logger
|
|
switch record.Level {
|
|
case slog.LevelDebug:
|
|
h.infraLogger.Debug(msg, args...)
|
|
case slog.LevelInfo:
|
|
h.infraLogger.Info(msg, args...)
|
|
case slog.LevelWarn:
|
|
h.infraLogger.Warn(msg, args...)
|
|
case slog.LevelError:
|
|
h.infraLogger.Error(msg, args...)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// WithAttrs adds attributes to the logger context
|
|
func (h *InfraLoggerHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
|
return h // Context attributes are ignored; implement if needed
|
|
}
|
|
|
|
// WithGroup groups log records; not used here
|
|
func (h *InfraLoggerHandler) WithGroup(name string) slog.Handler {
|
|
return h // Grouping is ignored; implement if needed
|
|
}
|
|
|
|
// toSlogLogger is a function to create *slog.Logger from Infra's log.Logger
|
|
func toSlogLogger(infraLogger log.Logger) *slog.Logger {
|
|
handler := &InfraLoggerHandler{infraLogger: infraLogger}
|
|
return slog.New(handler)
|
|
}
|