-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathlogger.go
153 lines (126 loc) · 3.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
148
149
150
151
152
153
package falcore
import (
"errors"
"log"
"time"
)
// I really want to use log4go... but i need to support falling back to standard (shitty) logger :(
// I suggest using go-timber for the real logger
type Logger interface {
// Matches the log4go interface
Finest(arg0 interface{}, args ...interface{})
Fine(arg0 interface{}, args ...interface{})
Debug(arg0 interface{}, args ...interface{})
Trace(arg0 interface{}, args ...interface{})
Info(arg0 interface{}, args ...interface{})
Warn(arg0 interface{}, args ...interface{}) error
Error(arg0 interface{}, args ...interface{}) error
Critical(arg0 interface{}, args ...interface{}) error
}
var logger Logger = NewStdLibLogger()
func SetLogger(newLogger Logger) {
logger = newLogger
}
// Helper for calculating times
func TimeDiff(startTime time.Time, endTime time.Time) float32 {
return float32(endTime.Sub(startTime)) / 1.0e9
}
// Global Logging
func Finest(arg0 interface{}, args ...interface{}) {
logger.Finest(arg0, args...)
}
func Fine(arg0 interface{}, args ...interface{}) {
logger.Fine(arg0, args...)
}
func Debug(arg0 interface{}, args ...interface{}) {
logger.Debug(arg0, args...)
}
func Trace(arg0 interface{}, args ...interface{}) {
logger.Trace(arg0, args...)
}
func Info(arg0 interface{}, args ...interface{}) {
logger.Info(arg0, args...)
}
func Warn(arg0 interface{}, args ...interface{}) error {
return logger.Warn(arg0, args...)
}
func Error(arg0 interface{}, args ...interface{}) error {
return logger.Error(arg0, args...)
}
func Critical(arg0 interface{}, args ...interface{}) error {
return logger.Critical(arg0, args...)
}
// This is a simple Logger implementation that
// uses the go log package for output. It's not
// really meant for production use since it isn't
// very configurable. It is a sane default alternative
// that allows us to not have any external dependencies.
// Use timber or log4go as a real alternative.
type StdLibLogger struct{}
func NewStdLibLogger() Logger {
return new(StdLibLogger)
}
type level int
const (
FINEST level = iota
FINE
DEBUG
TRACE
INFO
WARNING
ERROR
CRITICAL
)
var (
levelStrings = [...]string{"[FNST]", "[FINE]", "[DEBG]", "[TRAC]", "[INFO]", "[WARN]", "[EROR]", "[CRIT]"}
)
func (fl StdLibLogger) Finest(arg0 interface{}, args ...interface{}) {
fl.Log(FINEST, arg0, args...)
}
func (fl StdLibLogger) Fine(arg0 interface{}, args ...interface{}) {
fl.Log(FINE, arg0, args...)
}
func (fl StdLibLogger) Debug(arg0 interface{}, args ...interface{}) {
fl.Log(DEBUG, arg0, args...)
}
func (fl StdLibLogger) Trace(arg0 interface{}, args ...interface{}) {
fl.Log(TRACE, arg0, args...)
}
func (fl StdLibLogger) Info(arg0 interface{}, args ...interface{}) {
fl.Log(INFO, arg0, args...)
}
func (fl StdLibLogger) Warn(arg0 interface{}, args ...interface{}) error {
return fl.Log(WARNING, arg0, args...)
}
func (fl StdLibLogger) Error(arg0 interface{}, args ...interface{}) error {
return fl.Log(ERROR, arg0, args...)
}
func (fl StdLibLogger) Critical(arg0 interface{}, args ...interface{}) error {
return fl.Log(CRITICAL, arg0, args...)
}
func (fl StdLibLogger) Log(lvl level, arg0 interface{}, args ...interface{}) (e error) {
defer func() {
if x := recover(); x != nil {
var ok bool
if e, ok = x.(error); ok {
return
}
e = errors.New("Um... barf")
}
}()
switch first := arg0.(type) {
case string:
// Use the string as a format string
argsNew := append([]interface{}{levelStrings[lvl]}, args...)
log.Printf("%s "+first, argsNew...)
case func() string:
// Log the closure (no other arguments used)
argsNew := append([]interface{}{levelStrings[lvl]}, first())
log.Println(argsNew...)
default:
// Build a format string so that it will be similar to Sprint
argsNew := append([]interface{}{levelStrings[lvl]}, args...)
log.Println(argsNew...)
}
return nil
}