-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogdispatcher.go
171 lines (154 loc) · 3.48 KB
/
logdispatcher.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
package goolog2
import (
"fmt"
"sync"
)
// Dispatch a log object into the logger objects
type LogDispatcher interface {
// Destroy the distpatcher
//
// Warning: this method is not thread safe. Use it if you're certain
// all threads have stopped already.
Destroy()
// Log an object
//
// Parameters:
// subsystem: ID of logging subsystem
// severity: severity of the log message
// verbosity: verbosity of the log message
// object: an object to be logged
LogObject(
subsystem Subsystem,
severity Severity,
verbosity Verbosity,
object interface{})
// Add new logger
//
// Parameters:
// name: a unique name of the logger
// subsystem: ID of logging subsystem
// severity: maximal severity of the logger
// verbosity: maximal verbosity of the logger
// logger: the logger object
AddLogger(
name string,
subsystem Subsystem,
severities SeverityMask,
verbosity Verbosity,
logger Logger)
}
type logDispatcherRecord struct {
subsystem Subsystem
severities SeverityMask
verbosity Verbosity
logger Logger
}
type logDispatcher struct {
system string
loggers map[string]*logDispatcherRecord
mutex sync.RWMutex
}
// Create new log dispatcher
//
// Parameters:
// system: an identifier shown in the logs
func NewLogDispatcher(
system string,
) LogDispatcher {
return &logDispatcher{
system: system,
loggers: make(map[string]*logDispatcherRecord),
}
}
func (this *logDispatcher) Destroy() {
for _, record := range this.loggers {
record.logger.Destroy()
}
}
func (this *logDispatcher) LogObject(
subsystem Subsystem,
severity Severity,
verbosity Verbosity,
object interface{},
) {
/* -- iterate loggers, find matching ones and log the object */
this.mutex.RLock()
defer this.mutex.RUnlock()
for _, record := range this.loggers {
if (record.subsystem == "" || record.subsystem == subsystem) &&
(uint32(record.severities)&uint32(severity)) != 0 &&
verbosity <= record.verbosity {
/* -- the conditions match, log the object */
record.logger.LogObject(
this.system, subsystem, severity, verbosity, object)
}
}
}
func (this *logDispatcher) AddLogger(
name string,
subsystem Subsystem,
severities SeverityMask,
verbosity Verbosity,
logger Logger,
) {
this.mutex.Lock()
defer this.mutex.Unlock()
this.loggers[name] = &logDispatcherRecord{
subsystem: subsystem,
severities: severities,
verbosity: verbosity,
logger: logger,
}
}
// Log a logging object
func DispatcherLogObject(
log LogDispatcher,
subsystem Subsystem,
severity Severity,
verbosity Verbosity,
object interface{},
) {
log.LogObject(subsystem, severity, verbosity, object)
}
type simpleLogMessageObject struct {
message string
}
func (this *simpleLogMessageObject) GetLogLine() string {
return this.message
}
// Log a text message
func DispatcherLogMessage(
log LogDispatcher,
subsystem Subsystem,
severity Severity,
verbosity Verbosity,
message string,
) {
log.LogObject(
subsystem,
severity,
verbosity,
&simpleLogMessageObject{message})
}
type formattedLogMessageObject struct {
format string
args []interface{}
}
func (this *formattedLogMessageObject) GetLogLine() string {
return fmt.Sprintf(this.format, this.args...)
}
// Log a formatted text message
func DispatcherLogMessagef(
log LogDispatcher,
subsystem Subsystem,
severity Severity,
verbosity Verbosity,
format string,
args ...interface{},
) {
log.LogObject(
subsystem,
severity,
verbosity,
&formattedLogMessageObject{format, args})
}