-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.go
147 lines (120 loc) · 2.78 KB
/
logger.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
package logger
import (
"fmt"
"log"
"os"
"strings"
"github.com/fatih/color"
)
// Log levels. Levels are ordered from lowest to highest (higher log level
// include lower one).
const (
DebugLvl = "debug"
InfoLvl = "info"
WarnLvl = "warn"
ErrorLvl = "error"
customLvl = "custom"
)
type level struct {
name string
code int
format func(format string, a ...interface{}) string
}
var (
debug = level{DebugLvl, 0, color.CyanString}
info = level{InfoLvl, 1, color.WhiteString}
warn = level{WarnLvl, 2, color.YellowString}
err = level{ErrorLvl, 3, color.HiRedString}
custom = level{customLvl, 4, color.WhiteString}
l = &logger{
Level: info,
Logger: log.New(os.Stdout, "", log.Ldate|log.Ltime),
}
)
type logger struct {
Logger *log.Logger
Level level
}
// SetLogLevel sets logger's log level.
func SetLogLevel(lvl string) {
l.Level = parseLogLevel(lvl)
}
func parseLogLevel(lvl string) level {
l := lvl
switch l {
case "debug":
return debug
case "info":
return info
case "warn":
return warn
case "error":
return err
default:
return info
}
}
func write(lvl level, msg string) {
if lvl.code < l.Level.code {
return
}
if lvl.name == ErrorLvl {
//nolint: errcheck
l.Logger.Output(
1, lvl.format("[%s]%s", strings.ToUpper(lvl.name), msg),
)
return
}
if lvl.name == customLvl {
l.Logger.SetFlags(0)
defer l.Logger.SetFlags(log.LstdFlags)
//nolint: errcheck
l.Logger.Output(1, msg)
return
}
//nolint: errcheck
l.Logger.Output(
1,
fmt.Sprint(lvl.format("[%s]", strings.ToUpper(lvl.name)), msg),
)
}
// Debug logs a message at the debug level.
func Debug(msg ...interface{}) {
write(debug, fmt.Sprint(msg...))
}
// Debugf logs formtted message at the debug level.
func Debugf(msg string, v ...interface{}) {
write(debug, fmt.Sprintf(msg, v...))
}
// Info logs a message at the info level.
func Info(msg ...interface{}) {
write(info, fmt.Sprint(msg...))
}
// Infof logs formtted message at the info level.
func Infof(msg string, v ...interface{}) {
write(info, fmt.Sprintf(msg, v...))
}
// Warn logs a message at the warn level.
func Warn(msg ...interface{}) {
write(warn, fmt.Sprint(msg...))
}
// Warnf logs formtted message at the warn level.
func Warnf(msg string, v ...interface{}) {
write(warn, fmt.Sprintf(msg, v...))
}
// Error logs a message at the error level.
func Error(msg ...interface{}) {
write(err, fmt.Sprint(msg...))
}
// Errorf logs formtted message at the error level.
func Errorf(msg string, v ...interface{}) {
write(err, fmt.Sprintf(msg, v...))
}
// Custom logs a message at the custom level.
func Custom(msg ...interface{}) {
write(custom, fmt.Sprint(msg...))
}
// Customf logs formtted message at the custom level.
func Customf(msg string, v ...interface{}) {
write(custom, fmt.Sprintf(msg, v...))
}