-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserr.go
92 lines (74 loc) · 1.96 KB
/
serr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package logutils
import (
"context"
"errors"
"log/slog"
)
var errorer *Logger
const (
ERROR = "error"
)
type StructuredError struct {
Attrs []slog.Attr
Err error
}
func (serr StructuredError) Error() string {
return serr.Err.Error()
}
func NewStructuredError(err error, attrs ...slog.Attr) StructuredError {
return StructuredError{Err: err, Attrs: attrs}
}
func (serr StructuredError) Unwrap() error {
return serr.Err
}
type Errorer struct {
attrs []slog.Attr
}
func NewErrorer(attrs ...slog.Attr) *Errorer {
return &Errorer{
attrs: attrs,
}
}
func (e *Errorer) Error(err error, additional ...slog.Attr) error {
if err == nil {
return nil
}
var serr StructuredError
if errors.As(err, &serr) {
additional = append(additional, serr.Attrs...)
}
attrs := append(e.attrs, additional...)
return NewStructuredError(err, attrs...)
}
func SetDefaultErrorer(format Format) {
opts := slog.HandlerOptions{
AddSource: true,
ReplaceAttr: ReplaceSource,
}
errorer = NewLoggerFromDefault(&opts, format)
}
func ErrLog(level slog.Level, msg string, err error, additional ...slog.Attr) {
attrs := []slog.Attr{slog.Any(ERROR, err.Error())}
attrs = append(attrs, additional...)
if serr, ok := err.(StructuredError); ok {
attrs = append(attrs, serr.Attrs...)
errorer.LogAttrs(context.Background(), level, msg, attrs...)
} else {
errorer.LogAttrs(context.Background(), level, msg, attrs...)
}
}
func ErrTrace(msg string, err error, additional ...slog.Attr) {
ErrLog(LevelTrace, msg, err, additional...)
}
func ErrDebug(msg string, err error, additional ...slog.Attr) {
ErrLog(slog.LevelDebug, msg, err, additional...)
}
func ErrInfo(msg string, err error, additional ...slog.Attr) {
ErrLog(slog.LevelInfo, msg, err, additional...)
}
func ErrWarn(msg string, err error, additional ...slog.Attr) {
ErrLog(slog.LevelWarn, msg, err, additional...)
}
func ErrError(msg string, err error, additional ...slog.Attr) {
ErrLog(slog.LevelError, msg, err, additional...)
}