-
Notifications
You must be signed in to change notification settings - Fork 0
/
log.go
126 lines (108 loc) · 2.76 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 main
import (
"io"
"log"
"strings"
)
type LogLevel uint8
//go:generate stringer -type LogLevel -linecomment
const (
Debug LogLevel = iota + 1 // DEBUG
Info // INFO
Warn // WARN
Error // ERROR
)
var LogLevels = map[string]LogLevel{
"debug": Debug,
"info": Info,
"warn": Warn,
"error": Error,
}
// Logger is the type for logging information at different levels of severity.
// The Logger has three logStates representing each level that can be logged at,
// Debug, Info, and Error.
type Logger struct {
closer io.Closer
Debug logState
Info logState
Warn logState
Error logState
}
// Queue is a logger that can be given to CurlyQ for logging information about
// the jobs being processed.
type Queue struct {
*Logger
}
type logState struct {
logger *log.Logger
level LogLevel
actual LogLevel
}
// NewLog returns a new Logger that will write to the given io.Writer. This will
// use the stdlib's logger with the log.Ldate, log.Ltime, and log.LUTC flags
// set. The default level of the returned Logger is info.
func NewLog(wc io.WriteCloser) *Logger {
defaultLevel := Info
logger := log.New(wc, "", log.Ldate|log.Ltime|log.LUTC)
return &Logger{
closer: wc,
Debug: logState{
logger: logger,
level: defaultLevel,
actual: Debug,
},
Info: logState{
logger: logger,
level: defaultLevel,
actual: Info,
},
Warn: logState{
logger: logger,
level: defaultLevel,
actual: Warn,
},
Error: logState{
logger: logger,
level: defaultLevel,
actual: Error,
},
}
}
// SetLevel sets the level of the logger. The level should be either "debug",
// "info", or "error". If the given string is none of these values then the
// logger's level will be unchanged.
func (l *Logger) SetLevel(s string) {
if lvl, ok := LogLevels[strings.ToLower(s)]; ok {
l.Debug.level = lvl
l.Info.level = lvl
l.Error.level = lvl
}
}
// SetWriter set's the io.Writer for the underlying logger.
func (l *Logger) SetWriter(w io.WriteCloser) {
logger := log.New(w, "", log.Ldate|log.Ltime|log.LUTC)
l.closer = w
l.Debug.logger = logger
l.Info.logger = logger
l.Warn.logger = logger
l.Error.logger = logger
}
func (l *Logger) Close() error { return l.closer.Close() }
func (s *logState) Printf(format string, v ...interface{}) {
if s.actual < s.level {
return
}
s.logger.Printf(s.actual.String()+" "+format, v...)
}
func (s *logState) Println(v ...interface{}) {
if s.actual < s.level {
return
}
s.logger.Println(append([]interface{}{s.actual}, v...)...)
}
func (s *logState) Fatalf(format string, v ...interface{}) {
s.logger.Fatalf(s.actual.String()+" "+format, v...)
}
func (s *logState) Fatal(v ...interface{}) {
s.logger.Fatal(append([]interface{}{s.actual, " "}, v...)...)
}