123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package golog
- import (
- "context"
- "log/slog"
- )
- func integrade(logger any) Handler {
- switch v := logger.(type) {
- case *slog.Logger:
- return integradeSlog(v)
- case ExternalLogger:
- return integrateExternalLogger(v)
- case StdLogger:
- return integrateStdLogger(v)
- default:
- panic("not supported logger integration, please open a feature request at: https://github.com/kataras/golog/issues/new")
- }
- }
- /*
- func (*slog.Logger).Debug(msg string, args ...any)
- func (*slog.Logger).DebugContext(ctx context.Context, msg string, args ...any)
- func (*slog.Logger).Enabled(ctx context.Context, level slog.Level) bool
- func (*slog.Logger).Error(msg string, args ...any)
- func (*slog.Logger).ErrorContext(ctx context.Context, msg string, args ...any)
- func (*slog.Logger).Handler() slog.Handler
- func (*slog.Logger).Info(msg string, args ...any)
- func (*slog.Logger).InfoContext(ctx context.Context, msg string, args ...any)
- func (*slog.Logger).Log(ctx context.Context, level slog.Level, msg string, args ...any)
- func (*slog.Logger).LogAttrs(ctx context.Context, level slog.Level, msg string, attrs ...slog.Attr)
- func (*slog.Logger).Warn(msg string, args ...any)
- func (*slog.Logger).WarnContext(ctx context.Context, msg string, args ...any)
- func (*slog.Logger).With(args ...any) *slog.Logger
- func (*slog.Logger).WithGroup(name string) *slog.Logger
- */
- func integradeSlog(logger *slog.Logger) Handler {
- return func(log *Log) bool {
- // golog level to slog level.
- level := getSlogLevel(log.Level)
- // golog fields to slog attributes.
- if len(log.Fields) > 0 {
- attrs := make([]slog.Attr, 0, len(log.Fields))
- for k, v := range log.Fields {
- attrs = append(attrs, slog.Any(k, v))
- }
- // log the message with attrs.
- logger.LogAttrs(context.Background(), level, log.Message, attrs...)
- } else {
- logger.Log(context.Background(), level, log.Message)
- }
- return true
- }
- }
- // ExternalLogger is a typical logger interface.
- // Any logger or printer that completes this interface
- // can be used to intercept and handle the golog's messages.
- //
- // See `Logger#Install` and `Logger#Handle` for more.
- type ExternalLogger interface {
- Print(...interface{})
- Println(...interface{})
- Error(...interface{})
- Warn(...interface{})
- Info(...interface{})
- Debug(...interface{})
- }
- // integrateExternalLogger is a Handler which
- // intercepts all messages from print functions,
- // between print action and actual write to the output,
- // and sends these (messages) to the external "logger".
- //
- // In short terms, when this handler is passed via `Handle`
- // then, instead of printing from the logger's Printer
- // it prints from the given "logger".
- func integrateExternalLogger(logger ExternalLogger) Handler {
- return func(log *Log) bool {
- printFunc := getExternalPrintFunc(logger, log)
- printFunc(log.Message)
- return true
- }
- }
- func getSlogLevel(level Level) slog.Level {
- switch level {
- case ErrorLevel:
- return slog.LevelError
- case WarnLevel:
- return slog.LevelWarn
- case InfoLevel:
- return slog.LevelInfo
- case DebugLevel:
- return slog.LevelDebug
- }
- return slog.LevelDebug
- }
- func getExternalPrintFunc(logger ExternalLogger, log *Log) func(...interface{}) {
- switch log.Level {
- case ErrorLevel:
- return logger.Error
- case WarnLevel:
- return logger.Warn
- case InfoLevel:
- return logger.Info
- case DebugLevel:
- return logger.Debug
- }
- // disable level or use of golog#Print/Println functions:
- // passed with Println
- if log.NewLine {
- return logger.Println
- }
- return logger.Print
- }
- // StdLogger is the standard log.Logger interface.
- // Any logger or printer that completes this interface
- // can be used to intercept and handle the golog's messages.
- //
- // See `Logger#Install` and `Logger#Handle` for more.
- type StdLogger interface {
- Printf(format string, v ...interface{})
- Print(v ...interface{})
- Println(v ...interface{})
- }
- func integrateStdLogger(logger StdLogger) Handler {
- return func(log *Log) bool {
- printFunc := getStdPrintFunc(logger, log)
- printFunc(log.Message)
- return true
- }
- }
- func getStdPrintFunc(logger StdLogger, log *Log) func(...interface{}) {
- // no levels here
- // passed with Println
- if log.NewLine {
- return logger.Println
- }
- return logger.Print
- }
|