github.com/vseinstrumentiru/lego@v1.0.2/internal/lego/logerr.go (about)

     1  package lego
     2  
     3  import (
     4  	"context"
     5  	"emperror.dev/emperror"
     6  	"fmt"
     7  	"logur.dev/logur"
     8  )
     9  
    10  type LogErr interface {
    11  	// ===============
    12  	// Logger
    13  	// ===============
    14  	Log() logur.LoggerFacade
    15  	// Trace logs a Trace event.
    16  	//
    17  	// Even more fine-grained information than Debug events.
    18  	// Loggers not supporting this level should fall back to Debug.
    19  	Trace(msg string, fields ...map[string]interface{})
    20  	// Debug logs a Debug event.
    21  	//
    22  	// A verbose series of information events.
    23  	// They are useful when debugging the system.
    24  	Debug(msg string, fields ...map[string]interface{})
    25  	// Info logs an Info event.
    26  	//
    27  	// General information about what's happening inside the system.
    28  	Info(msg string, fields ...map[string]interface{})
    29  	// Warn logs a Warn(ing) event.
    30  	//
    31  	// Non-critical events that should be looked at.
    32  	Warn(msg string, fields ...map[string]interface{})
    33  	// Error logs an Error event.
    34  	//
    35  	// Critical events that require immediate attention.
    36  	// Loggers commonly provide Fatal and Panic levels above Error level,
    37  	// but exiting and panicing is out of scope for a logging library.
    38  	Error(msg string, fields ...map[string]interface{})
    39  	// TraceContext logs a Trace event.
    40  	//
    41  	// Even more fine-grained information than Debug events.
    42  	// Loggers not supporting this level should fall back to Debug.
    43  	TraceContext(ctx context.Context, msg string, fields ...map[string]interface{})
    44  	// DebugContext logs a Debug event.
    45  	//
    46  	// A verbose series of information events.
    47  	// They are useful when debugging the system.
    48  	DebugContext(ctx context.Context, msg string, fields ...map[string]interface{})
    49  	// InfoContext logs an Info event.
    50  	//
    51  	// General information about what's happening inside the system.
    52  	InfoContext(ctx context.Context, msg string, fields ...map[string]interface{})
    53  	// WarnContext logs a Warn(ing) event.
    54  	//
    55  	// Non-critical events that should be looked at.
    56  	WarnContext(ctx context.Context, msg string, fields ...map[string]interface{})
    57  	// ErrorContext logs an Error event.
    58  	//
    59  	// Critical events that require immediate attention.
    60  	// Loggers commonly provide Fatal and Panic levels above Error level,
    61  	// but exiting and panicing is out of scope for a logging library.
    62  	ErrorContext(ctx context.Context, msg string, fields ...map[string]interface{})
    63  	// WithFields annotates a log with key-value pairs.
    64  	WithFields(fields map[string]interface{}) LogErr
    65  	// WithContext annotates a log with a contexttool.
    66  	WithContext(ctx context.Context) LogErr
    67  	// ===============
    68  	// Error Handler
    69  	// ===============
    70  	Handler() emperror.ErrorHandlerFacade
    71  
    72  	Handle(err error)
    73  
    74  	HandleContext(ctx context.Context, err error)
    75  
    76  	WithFilter(matcher ErrorMatcher) LogErr
    77  
    78  	WithDetails(details ...interface{}) LogErr
    79  }
    80  
    81  type ErrorMatcher func(err error) bool
    82  
    83  type ContextExtractor func(ctx context.Context) map[string]interface{}
    84  
    85  type logErr struct {
    86  	logur.LoggerFacade
    87  	emperror.ErrorHandlerFacade
    88  	extractor ContextExtractor
    89  }
    90  
    91  func NewLogErr(logger logur.LoggerFacade, handler emperror.ErrorHandlerFacade) LogErr {
    92  	return &logErr{
    93  		LoggerFacade:       logger,
    94  		ErrorHandlerFacade: handler,
    95  	}
    96  }
    97  
    98  // NewContextAwareLogger returns a new Logger instance that can extract information from a contexttool.
    99  func NewContextAwareLogErr(logger logur.LoggerFacade, handler emperror.ErrorHandlerFacade, extractor ContextExtractor) LogErr {
   100  	return &logErr{
   101  		LoggerFacade:       logur.WithContextExtractor(logger, logur.ContextExtractor(extractor)),
   102  		ErrorHandlerFacade: emperror.WithContextExtractor(handler, emperror.ContextExtractor(extractor)),
   103  		extractor:          extractor,
   104  	}
   105  }
   106  
   107  func (l *logErr) Log() logur.LoggerFacade {
   108  	return l.LoggerFacade
   109  }
   110  
   111  func (l *logErr) Handler() emperror.ErrorHandlerFacade {
   112  	return l.ErrorHandlerFacade
   113  }
   114  
   115  func (l *logErr) WithFields(fields map[string]interface{}) LogErr {
   116  	return &logErr{
   117  		LoggerFacade:       logur.WithFields(l.LoggerFacade, fields),
   118  		ErrorHandlerFacade: l.ErrorHandlerFacade,
   119  		extractor:          l.extractor,
   120  	}
   121  }
   122  
   123  // WithContext annotates a log with a contexttool.
   124  func (l *logErr) WithContext(ctx context.Context) LogErr {
   125  	if l.extractor == nil {
   126  		return l
   127  	}
   128  
   129  	return l.WithFields(l.extractor(ctx))
   130  }
   131  
   132  // WithContext annotates a log with a contexttool.
   133  func (l *logErr) WithFilter(matcher ErrorMatcher) LogErr {
   134  	return &logErr{
   135  		LoggerFacade:       l.LoggerFacade,
   136  		ErrorHandlerFacade: emperror.WithFilter(l.ErrorHandlerFacade, emperror.ErrorMatcher(matcher)),
   137  		extractor:          l.extractor,
   138  	}
   139  }
   140  
   141  func (l *logErr) WithDetails(details ...interface{}) LogErr {
   142  	return &logErr{
   143  		LoggerFacade:       l.LoggerFacade,
   144  		ErrorHandlerFacade: emperror.WithDetails(l.ErrorHandlerFacade, details...),
   145  		extractor:          l.extractor,
   146  	}
   147  }
   148  
   149  type LogErrF interface {
   150  	LogErr
   151  	Errorf(format string, v ...interface{})
   152  	Warnf(format string, v ...interface{})
   153  	Debugf(format string, v ...interface{})
   154  }
   155  
   156  type logErrF struct {
   157  	LogErr
   158  }
   159  
   160  func NewLogErrF(logErr LogErr) *logErrF {
   161  	return &logErrF{LogErr: logErr}
   162  }
   163  
   164  func (l *logErrF) Errorf(format string, v ...interface{}) {
   165  	l.Error(fmt.Sprintf(format, v...))
   166  }
   167  
   168  func (l *logErrF) Warnf(format string, v ...interface{}) {
   169  	l.Warn(fmt.Sprintf(format, v...))
   170  }
   171  
   172  func (l *logErrF) Debugf(format string, v ...interface{}) {
   173  	l.Debug(fmt.Sprintf(format, v...))
   174  }