94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
package logfrog
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
)
|
|
|
|
func getType(v interface{}) string {
|
|
if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr {
|
|
return "*" + t.Elem().PkgPath() + "." + t.Elem().Name()
|
|
} else {
|
|
return t.PkgPath() + "." + t.Name()
|
|
}
|
|
}
|
|
|
|
type ErrorSource struct {
|
|
// fully-quallified name of the source object
|
|
Source string
|
|
Error error
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------
|
|
|
|
type ErrLoggerCloseFailure struct {
|
|
ProcessorCloseErrors []ErrorSource
|
|
HandlerCloseErrors []ErrorSource
|
|
}
|
|
|
|
func (e *ErrLoggerCloseFailure) addProcessorError(v interface{}, err error) {
|
|
e.ProcessorCloseErrors = append(e.ProcessorCloseErrors, ErrorSource{ getType(v), err })
|
|
}
|
|
|
|
func (e *ErrLoggerCloseFailure) addHandlerError(v interface{}, err error) {
|
|
e.HandlerCloseErrors = append(e.HandlerCloseErrors, ErrorSource{ getType(v), err })
|
|
}
|
|
|
|
func (e *ErrLoggerCloseFailure) containsErrors() bool {
|
|
return (len(e.ProcessorCloseErrors) > 0) || (len(e.HandlerCloseErrors) > 0)
|
|
}
|
|
|
|
func (e *ErrLoggerCloseFailure) Error() string {
|
|
var errorTexts []string
|
|
if len(e.ProcessorCloseErrors) > 0 {
|
|
errorTexts = append(errorTexts, fmt.Sprintf("%d processor errors", len(e.ProcessorCloseErrors)))
|
|
}
|
|
if len(e.HandlerCloseErrors) > 0 {
|
|
errorTexts = append(errorTexts, fmt.Sprintf("%d handler errors", len(e.HandlerCloseErrors)))
|
|
}
|
|
|
|
return fmt.Sprintf("error while closing logger: %s", strings.Join(errorTexts, ", "))
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------
|
|
|
|
type ErrHandlerCloseFailure struct {
|
|
ProcessorCloseErrors []ErrorSource
|
|
FormatterCloseError *ErrorSource
|
|
HandlerOnCloseError *ErrorSource
|
|
}
|
|
|
|
func (e *ErrHandlerCloseFailure) addProcessorError(v interface{}, err error) {
|
|
e.ProcessorCloseErrors = append(e.ProcessorCloseErrors, ErrorSource{ getType(v), err })
|
|
}
|
|
|
|
func (e *ErrHandlerCloseFailure) setFormatterError(v interface{}, err error) {
|
|
e.FormatterCloseError = &ErrorSource{ getType(v), err }
|
|
}
|
|
|
|
func (e *ErrHandlerCloseFailure) setHandlerError(v interface{}, err error) {
|
|
e.HandlerOnCloseError = &ErrorSource{ getType(v), err }
|
|
}
|
|
|
|
func (e *ErrHandlerCloseFailure) containsErrors() bool {
|
|
return (len(e.ProcessorCloseErrors) > 0) || (e.FormatterCloseError != nil) || (e.HandlerOnCloseError != nil)
|
|
}
|
|
|
|
func (e *ErrHandlerCloseFailure) Error() string {
|
|
var errorTexts []string
|
|
if len(e.ProcessorCloseErrors) > 0 {
|
|
errorTexts = append(errorTexts, fmt.Sprintf("%d processor errors", len(e.ProcessorCloseErrors)))
|
|
}
|
|
if e.FormatterCloseError != nil {
|
|
errorTexts = append(errorTexts, "a formatter error")
|
|
}
|
|
if e.HandlerOnCloseError != nil {
|
|
errorTexts = append(errorTexts, "a handler's OnClose() error")
|
|
}
|
|
|
|
return fmt.Sprintf("error while closing logger: %s", strings.Join(errorTexts, ", "))
|
|
}
|
|
|
|
|
|
// --------------------------------------------------------------------------------
|