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 }