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
|
package log
/*
Handles the on/off flags for things like log.Info() and log.Warn()
*/
import (
"sync"
)
var INFO LogFlag
var VERBOSE LogFlag
var SPEW LogFlag
var WARN LogFlag
var ERROR LogFlag
var PRINTLN LogFlag
// writeMutex protects locks the write process
var flagsMutex sync.Mutex
type LogFlag struct {
B bool
Default bool // set at the time of Registration()
Name string
// TODO: figure out what package is sending the Registration
Subsystem string // probably should just be forced to be the package name
Short string // string actually printed on each line
Desc string
}
var flags []*LogFlag
func init() {
INFO.B = false
INFO.Name = "INFO"
INFO.Subsystem = "log"
INFO.Desc = "Enable log.Info()"
INFO.Register()
SPEW.B = false
SPEW.Name = "SPEW"
SPEW.Subsystem = "log"
SPEW.Desc = "Enable log.Spew()"
SPEW.Register()
VERBOSE.B = false
VERBOSE.Name = "VERBOSE"
VERBOSE.Subsystem = "log"
VERBOSE.Desc = "Enable log.Verbose()"
VERBOSE.Register()
WARN.B = true
WARN.Name = "WARN"
WARN.Subsystem = "log"
WARN.Desc = "Enable log.Warn()"
WARN.Register()
ERROR.B = true
ERROR.Name = "ERROR"
ERROR.Subsystem = "log"
ERROR.Desc = "Enable log.Error()"
ERROR.Register()
PRINTLN.B = true
PRINTLN.Name = "PRINTLN"
PRINTLN.Subsystem = "log"
PRINTLN.Desc = "Enable log.Println()"
PRINTLN.Register()
}
// set all the flags
func SetAll(b bool) {
flagsMutex.Lock()
defer flagsMutex.Unlock()
for _, f := range flags {
f.B = b
}
}
// set all the flags
func SetDefaults() {
flagsMutex.Lock()
defer flagsMutex.Unlock()
for _, f := range flags {
f.B = f.Default
}
}
// this bypasses all checks and _always_ logs the info to STDOUT
// is this a bad idea? Probably not....
// TODO: returning []*LogFlag is not safe and access must be locked
// but this is only used by the log debugging window at this time
func ShowFlags() []*LogFlag {
flagsMutex.Lock()
defer flagsMutex.Unlock()
for _, f := range flags {
Log(true, "ShowFlags() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
}
return flags
}
// TODO, switch to this
func ProcessFlags(callback func(*LogFlag)) {
flagsMutex.Lock()
defer flagsMutex.Unlock()
for _, f := range flags {
Log(true, "ProcessFlags() run callback(f) here on", f)
callback(f)
}
}
// register a variable name from a subsystem
// inspired by Alex Flint
// set the Default value at the time of registration
func (f *LogFlag) Register() {
flagsMutex.Lock()
defer flagsMutex.Unlock()
Info("log.Register() ", f)
f.Default = f.B
flags = append(flags,f)
}
func (f *LogFlag) Set(b bool) {
flagsMutex.Lock()
defer flagsMutex.Unlock()
Info("Set() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
f.B = b
Info("Set() f.B is now", f.B)
}
func Set(subsystem string, name string, b bool) {
flagsMutex.Lock()
defer flagsMutex.Unlock()
Verbose("log.Set() TODO find var:", "(" + subsystem + ")", name, "=", b)
for _, f := range flags {
Verbose("log.Set() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
if (subsystem == f.Subsystem) && (name == f.Name) {
Verbose("log.Set() FOUND ", f)
f.B = b
return
}
}
}
func Get(subsystem string, name string) bool {
flagsMutex.Lock()
defer flagsMutex.Unlock()
Verbose("log.Get() TODO find var:", "(" + subsystem + ")", name)
for _, f := range flags {
Verbose("log.Get() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
if (subsystem == f.Subsystem) && (name == f.Name) {
Verbose("log.Get() FOUND ", f)
return f.B
}
}
return false
}
|