-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathbuilder.go
168 lines (139 loc) · 3.12 KB
/
builder.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
package handler
import (
"io"
"github.com/gookit/slog"
"github.com/gookit/slog/rotatefile"
)
//
// ---------------------------------------------------------------------------
// handler builder
// ---------------------------------------------------------------------------
//
// Builder struct for create handler
type Builder struct {
*Config
Output io.Writer
}
// NewBuilder create
func NewBuilder() *Builder {
return &Builder{
Config: NewEmptyConfig(),
}
}
// WithOutput to the builder
func (b *Builder) WithOutput(w io.Writer) *Builder {
b.Output = w
return b
}
// With some config fn
//
// Deprecated: please use WithConfigFn()
func (b *Builder) With(fns ...ConfigFn) *Builder {
return b.WithConfigFn(fns...)
}
// WithConfigFn some config fn
func (b *Builder) WithConfigFn(fns ...ConfigFn) *Builder {
b.Config.With(fns...)
return b
}
// WithLogfile setting
func (b *Builder) WithLogfile(logfile string) *Builder {
b.Logfile = logfile
return b
}
// WithLevelMode setting
func (b *Builder) WithLevelMode(mode slog.LevelMode) *Builder {
b.LevelMode = mode
return b
}
// WithLogLevel setting
func (b *Builder) WithLogLevel(level slog.Level) *Builder {
b.Level = level
return b
}
// WithLogLevels setting
func (b *Builder) WithLogLevels(levels []slog.Level) *Builder {
b.Levels = levels
return b
}
// WithBuffMode setting
func (b *Builder) WithBuffMode(bufMode string) *Builder {
b.BuffMode = bufMode
return b
}
// WithBuffSize setting
func (b *Builder) WithBuffSize(bufSize int) *Builder {
b.BuffSize = bufSize
return b
}
// WithMaxSize setting
func (b *Builder) WithMaxSize(maxSize uint64) *Builder {
b.MaxSize = maxSize
return b
}
// WithRotateTime setting
func (b *Builder) WithRotateTime(rt rotatefile.RotateTime) *Builder {
b.RotateTime = rt
return b
}
// WithCompress setting
func (b *Builder) WithCompress(compress bool) *Builder {
b.Compress = compress
return b
}
// WithUseJSON setting
func (b *Builder) WithUseJSON(useJSON bool) *Builder {
b.UseJSON = useJSON
return b
}
// Build slog handler.
func (b *Builder) Build() slog.FormattableHandler {
if b.Output != nil {
return b.buildFromWriter(b.Output)
}
if b.Logfile != "" {
w, err := b.CreateWriter()
if err != nil {
panic(err)
}
return b.buildFromWriter(w)
}
panic("slog: missing information for build slog handler")
}
// Build slog handler.
func (b *Builder) buildFromWriter(w io.Writer) (h slog.FormattableHandler) {
defer b.reset()
bufSize := b.BuffSize
lf := b.newLevelFormattable()
if scw, ok := w.(SyncCloseWriter); ok {
if bufSize > 0 {
scw = b.wrapBuffer(scw)
}
h = NewSyncCloserWithLF(scw, lf)
} else if fcw, ok := w.(FlushCloseWriter); ok {
if bufSize > 0 {
fcw = b.wrapBuffer(fcw)
}
h = NewFlushCloserWithLF(fcw, lf)
} else if wc, ok := w.(io.WriteCloser); ok {
if bufSize > 0 {
wc = b.wrapBuffer(wc)
}
h = NewWriteCloserWithLF(wc, lf)
} else {
if bufSize > 0 {
w = b.wrapBuffer(w)
}
h = NewIOWriterWithLF(w, lf)
}
// use json format.
if b.UseJSON {
h.SetFormatter(slog.NewJSONFormatter())
}
return
}
// rest builder.
func (b *Builder) reset() {
b.Output = nil
b.Config = NewEmptyConfig()
}