forked from skynetservices/skynet-archive
/
multi_semantic_logger.go
82 lines (71 loc) · 1.98 KB
/
multi_semantic_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
package skynet
type MultiSemanticLogger []SemanticLogger
func NewMultiSemanticLogger(loggers ...SemanticLogger) (ml MultiSemanticLogger) {
ml = loggers
return
}
//
// This section defines methods necessary for MultiSemanticLogger to
// implement SemanticLogger
//
// Log calls .Log(payload) for each logger in the
// MultiSemanticLogger. For each logger, logging behavior may vary
// depending upon the LogLevel.
func (ml MultiSemanticLogger) Log(payload *LogPayload) {
switch payload.Level {
default:
// Log payloads with custom log levels just like those with
// the known/defult log levels
fallthrough
case TRACE, DEBUG, INFO, WARN, ERROR, FATAL:
for _, lgr := range ml {
lgr.Log(payload)
}
}
}
func (ml MultiSemanticLogger) Trace(msg string) {
for _, lgr := range ml {
lgr.Log(NewLogPayload(TRACE, msg))
}
}
func (ml MultiSemanticLogger) Debug(msg string) {
for _, lgr := range ml {
lgr.Log(NewLogPayload(DEBUG, msg))
}
}
func (ml MultiSemanticLogger) Info(msg string) {
for _, lgr := range ml {
lgr.Log(NewLogPayload(INFO, msg))
}
}
func (ml MultiSemanticLogger) Warn(msg string) {
for _, lgr := range ml {
lgr.Log(NewLogPayload(WARN, msg))
}
}
func (ml MultiSemanticLogger) Error(msg string) {
for _, lgr := range ml {
lgr.Log(NewLogPayload(ERROR, msg))
}
}
// Fatal creates a *LogPayload, adds stacktrace data to it, calls
// .Log(payload) for each logger in the MultiSemanticLogger, then
// panics.
func (ml MultiSemanticLogger) Fatal(msg string) {
payload := NewLogPayload(FATAL, msg)
payload.Backtrace = genStacktrace()
for _, lgr := range ml {
// Calling .Fatal for each would result in panicking on
// the first logger, so we log them all, then panic.
lgr.Log(payload)
}
panic(payload)
}
// BenchmarkInfo runs .BenchmarkInfo(level, msg, f) on every logger in
// the MultiSemanticLogger.
func (ml MultiSemanticLogger) BenchmarkInfo(level LogLevel, msg string,
f func(logger SemanticLogger)) {
for _, lgr := range ml {
lgr.BenchmarkInfo(level, msg, f)
}
}