-
Notifications
You must be signed in to change notification settings - Fork 0
/
log.go
126 lines (101 loc) · 3.06 KB
/
log.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package log
import (
"context"
"io"
"os"
"unsafe"
"cdr.dev/slog"
"cdr.dev/slog/sloggers/sloghuman"
"cdr.dev/slog/sloggers/slogjson"
)
// Level defined log level
type Level slog.Level
// Field contains additional logging fields
type Field slog.Field
// JSON creates a json logger
func JSON(w io.Writer) slog.Logger {
return slogjson.Make(w)
}
// Terminal creates a terminal logger
func Terminal(w io.Writer) slog.Logger {
return sloghuman.Make(w)
}
// F creates a field
func F(key string, value interface{}) Field {
return Field(slog.F(key, value))
}
var (
// LevelDebug is used for development and debugging messages.
LevelDebug = Level(slog.LevelDebug)
// LevelInfo is used for normal informational messages.
LevelInfo = Level(slog.LevelInfo)
// LevelWarn is used when something has possibly gone wrong.
LevelWarn = Level(slog.LevelWarn)
// LevelError is used when something has certainly gone wrong.
LevelError = Level(slog.LevelError)
// LevelCritical is used when when something has gone wrong and should
// be immediately investigated.
LevelCritical = Level(slog.LevelCritical)
// LevelFatal is used when the process is about to exit due to an error.
LevelFatal = Level(slog.LevelFatal)
)
// Logger defines a logger interface
type Logger interface {
Debug(msg string, fields ...Field)
Info(msg string, fields ...Field)
Warn(msg string, fields ...Field)
Error(msg string, fields ...Field)
Critical(msg string, fields ...Field)
Fatal(msg string, fields ...Field)
}
type wrapper struct {
logger *slog.Logger
context context.Context
}
// Config represents a logger configuration
type Config struct {
Writer io.Writer
Level Level
Context context.Context
Make func(io.Writer) slog.Logger
Fields []Field
}
// New creates a new logger
func New(config Config) Logger {
logger := config.
Make(config.Writer).
Leveled(slog.Level(config.Level)).
With((*(*[]slog.Field)(unsafe.Pointer(&config.Fields)))...)
return &wrapper{
logger: &logger,
context: config.Context,
}
}
func (w *wrapper) Debug(msg string, fields ...Field) {
w.logger.Debug(w.context, msg, (*(*[]slog.Field)(unsafe.Pointer(&fields)))...)
}
func (w *wrapper) Info(msg string, fields ...Field) {
w.logger.Info(w.context, msg, (*(*[]slog.Field)(unsafe.Pointer(&fields)))...)
}
func (w *wrapper) Warn(msg string, fields ...Field) {
w.logger.Warn(w.context, msg, (*(*[]slog.Field)(unsafe.Pointer(&fields)))...)
}
func (w *wrapper) Error(msg string, fields ...Field) {
w.logger.Error(w.context, msg, (*(*[]slog.Field)(unsafe.Pointer(&fields)))...)
}
func (w *wrapper) Critical(msg string, fields ...Field) {
w.logger.Critical(w.context, msg, (*(*[]slog.Field)(unsafe.Pointer(&fields)))...)
}
func (w *wrapper) Fatal(msg string, fields ...Field) {
w.logger.Fatal(w.context, msg, (*(*[]slog.Field)(unsafe.Pointer(&fields)))...)
}
// DefaultConfig represents default logger configuration
var DefaultConfig = Config{
Writer: os.Stdout,
Make: Terminal,
Level: LevelDebug,
Context: context.Background(),
Fields: []Field{},
}
// Default is the default logger
var Default = New(DefaultConfig)