-
Notifications
You must be signed in to change notification settings - Fork 1
/
clog.go
193 lines (176 loc) · 3.64 KB
/
clog.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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package clog
// Miscellaneous functions
import (
"fmt"
"time"
"github.com/logrusorgru/aurora"
)
// Check checks if an error exists, if so, prints a log to the specified log level with a string and returns if err was nil
func Check(err error, tag int, where string) (wasError bool) {
if err != nil {
wasError = true
L[tag].Chan <- L[tag].Name() + " " + err.Error()
if tag == Ftl.Num {
panic("died")
}
}
return
}
// Lvl is a log level data structure
type Lvl struct {
Num int
Name func(c ...int) string
Chan chan string
}
const (
// Nftl is the number for fatal errors
Nftl = iota
// Nerr is the number for errors
Nerr
// Nwrn is the number for warnings
Nwrn
// Ninf is the number for information
Ninf
// Ndbg is the number for debugging
Ndbg
// Ntrc is the number for trace
Ntrc
)
var (
ftlFn = func(c ...int) string {
out := "FTL"
if len(c) > 0 {
return aurora.BgRed(out).String()
}
return out
}
errFn = func(c ...int) string {
out := "ERR"
if len(c) > 0 {
return aurora.Red(out).String()
}
return out
}
wrnFn = func(c ...int) string {
out := "ERR"
if len(c) > 0 {
return aurora.Brown(out).String()
}
return out
}
infFn = func(c ...int) string {
out := "INF"
if len(c) > 0 {
return aurora.Green(out).String()
}
return out
}
dbgFn = func(c ...int) string {
out := "DBG"
if len(c) > 0 {
return aurora.Blue(out).String()
}
return out
}
trcFn = func(c ...int) string {
out := "TRC"
if len(c) > 0 {
return aurora.BgBlue(out).String()
}
return out
}
// Ftl is for critical/fatal errors
Ftl = &Lvl{0, ftlFn, nil}
// Err is an error that does block continuation
Err = &Lvl{1, errFn, nil}
// Wrn is is a warning of a correctable condition
Wrn = &Lvl{2, wrnFn, nil}
// Inf is is general information
Inf = &Lvl{3, infFn, nil}
// Dbg is debug level information
Dbg = &Lvl{4, dbgFn, nil}
// Trc is detailed outputs of contents of variables
Trc = &Lvl{5, trcFn, nil}
// L is an array of log levels that can be selected given the level number
L = []*Lvl{
Ftl,
Err,
Wrn,
Inf,
Dbg,
Trc,
}
// LogLevel is a dynamically settable log level filter that excludes higher values from output
LogLevel = Trc.Num
// Quit signals the logger to stop
Quit = make(chan struct{})
// LogIt is the function that performs the output, can be loaded by the caller
LogIt = Print
color = true
)
// Color sets whether tags are coloured or not, 0 color
func Color(on bool) {
color = on
}
// GetColor returns if color is turned on
func GetColor() bool {
return color
}
// Init manually starts a clog
func Init(fn ...func(name, txt string)) bool {
var ready []chan bool
Ftl.Chan = make(chan string)
Err.Chan = make(chan string)
Wrn.Chan = make(chan string)
Inf.Chan = make(chan string)
Dbg.Chan = make(chan string)
Trc.Chan = make(chan string)
// override the output function if one is given
if len(fn) > 0 {
LogIt = fn[0]
}
for range L {
ready = append(ready, make(chan bool))
}
for i := range L {
go startChan(i, ready[i])
}
for i := range ready {
<-ready[i]
}
Dbg.Chan <- "logger started"
return true
}
// Print out a formatted log message
func Print(name, txt string) {
fmt.Printf("%s [%s] %s\n",
time.Now().UTC().Format("2006-01-02 15:04:05.000000 MST"),
name,
txt,
)
}
func startChan(ch int, ready chan bool) {
L[ch].Chan = make(chan string)
ready <- true
done := true
for done {
select {
case <-Quit:
done = false
continue
case txt := <-L[ch].Chan:
if ch <= LogLevel {
if color {
LogIt(L[ch].Name(1), txt)
} else {
LogIt(L[ch].Name(), txt)
}
if ch == Nftl {
panic(txt)
}
}
continue
default:
}
}
}