-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder.go
More file actions
121 lines (101 loc) · 3.01 KB
/
builder.go
File metadata and controls
121 lines (101 loc) · 3.01 KB
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
package log
import "io"
type (
LoggerBuilder struct {
LoggerMeta
path string
maxLogFileSize int64 // set to 0 to disable rotations
maxFileArchives int // set to 0 to disable rotations
}
LoggerMeta struct {
level Level // defaults to WARN
name string // the name of the logger
stdoutEnabled bool
stderrEnabled bool
handlers []LogHandler
cleanup []func() // to be ran on fatal
}
)
func NewLogger() *LoggerBuilder {
return &LoggerBuilder{
LoggerMeta: LoggerMeta{
level: WARN,
stdoutEnabled: true,
stderrEnabled: true,
},
}
}
func (lb *LoggerBuilder) Build() (*Logger, error) {
if lb.level <= TRACE || lb.level > QUIET {
return nil, ErrInvalidLogLevel
}
if lb.path != "" {
fh, err := NewFileHandler(lb.path)
if err != nil {
return nil, err
}
switch lb.maxLogFileSize {
case 0:
fh.SetMaxFileSize(1 << 20)
case -1:
fh.SetMaxFileSize(0)
default:
if lb.maxLogFileSize < 0 {
return nil, ErrInvalidMaxFileSize
}
fh.SetMaxFileSize(lb.maxLogFileSize)
}
switch lb.maxFileArchives {
case 0:
fh.SetMaxFileArchives(10)
case -1:
fh.SetMaxFileArchives(0)
default:
if lb.maxFileArchives < 0 {
return nil, ErrInvalidMaxFileArchives
}
fh.SetMaxFileArchives(lb.maxFileArchives)
}
lb.handlers = append(lb.handlers, fh)
lb.path = ""
}
if lb.name == "" {
lb.name = "???"
}
return &Logger{
LoggerMeta: lb.LoggerMeta,
}, nil
}
func (lb *LoggerBuilder) WithHandlers(hs ...LogHandler) *LoggerBuilder {
lb.handlers = append(lb.handlers, hs...)
return lb
}
func (lb *LoggerBuilder) WithCleanup(fns ...func()) *LoggerBuilder {
lb.cleanup = append(lb.cleanup, fns...)
return lb
}
func (lb *LoggerBuilder) Name(name string) *LoggerBuilder { lb.name = name; return lb }
// path is the path to the log file
// maxLogFileSize is the maximum size of the log file in bytes before it is rotated (set to -1 to disable rotations)
// maxArchives is the maximum number of log files to keep (set to -1 to disable rotations)
func (lb *LoggerBuilder) WithFile(path string, maxLogFileSize int64, maxArchives int) *LoggerBuilder {
lb.path = path
lb.maxLogFileSize = maxLogFileSize
lb.maxFileArchives = maxArchives
return lb
}
func (lb *LoggerBuilder) WithWriter(wr io.Writer) *LoggerBuilder {
lb.handlers = append(lb.handlers, NewWriterHandler(wr))
return lb
}
func (lb *LoggerBuilder) WithStdout(on bool) *LoggerBuilder { lb.stdoutEnabled = on; return lb }
func (lb *LoggerBuilder) WithStderr(on bool) *LoggerBuilder { lb.stderrEnabled = on; return lb }
func (lb *LoggerBuilder) Trace() *LoggerBuilder { lb.level = TRACE; return lb }
func (lb *LoggerBuilder) Debug() *LoggerBuilder { lb.level = DEBUG; return lb }
func (lb *LoggerBuilder) Info() *LoggerBuilder { lb.level = INFO; return lb }
func (lb *LoggerBuilder) Warn() *LoggerBuilder { lb.level = WARN; return lb }
func (lb *LoggerBuilder) Error() *LoggerBuilder { lb.level = ERROR; return lb }
func (lb *LoggerBuilder) WithLevel(level Level) *LoggerBuilder {
lb.level = level
return lb
}