-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogger.go
151 lines (130 loc) · 3.4 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
package log
import (
"fmt"
"io"
"os"
"sync"
"time"
)
// Logger holds all logger configurations
type Logger struct {
debug bool
trace bool
mu mutex
formatter Formatter
timeformat string
localtime bool
staticKVs []staticKV
timeKey string
messageKey string
levelKey string
withoutTime bool
withoutLevel bool
writer io.Writer
}
// New initializes a new logger using options to configure the logger
func New(formatter Formatter, options ...Option) *Logger {
if formatter == nil {
panic("missing log formatter")
}
l := &Logger{
mu: &sync.Mutex{},
timeformat: time.RFC3339,
timeKey: "TIME",
messageKey: "MESSAGE",
levelKey: "LEVEL",
writer: os.Stdout,
formatter: formatter,
}
for _, option := range options {
if option == nil {
panic("nil option in logger initialization found")
}
option(l)
}
l.validateOptions()
return l
}
func (l *Logger) log(level string, message string, kv ...interface{}) (n int, err error) {
for _, s := range l.staticKVs {
kv = append([]interface{}{s.key, s.value}, kv...)
}
msg := l.formatter(l, level, message, kv...)
l.mu.Lock()
n, err = fmt.Fprintln(l.writer, msg)
l.mu.Unlock()
return
}
// Info message
func (l *Logger) Info(message string, kv ...interface{}) (int, error) {
return l.log("Info", message, kv...)
}
func (l *Logger) Print(message string, kv ...interface{}) (int, error) {
return l.Info(message, kv...)
}
// Notice message
func (l *Logger) Notice(message string, kv ...interface{}) (int, error) {
return l.log("Notice", message, kv...)
}
// Warning message
func (l *Logger) Warning(message string, kv ...interface{}) (int, error) {
return l.log("Warning", message, kv...)
}
// Error message
func (l *Logger) Error(message string, kv ...interface{}) (int, error) {
return l.log("Error", message, kv...)
}
// Fatal message
func (l *Logger) Fatal(message string, kv ...interface{}) (int, error) {
return l.log("Fatal", message, kv...)
}
// Debug message
func (l *Logger) Debug(message string, kv ...interface{}) (int, error) {
if !l.debug {
return 0, nil
}
return l.log("Debug", message, kv...)
}
// Trace message
func (l *Logger) Trace(message string, kv ...interface{}) (int, error) {
if !l.trace {
return 0, nil
}
return l.log("Trace", message, kv...)
}
var logger = New(FormatterSimple)
// SetLogger sets a global logger
func SetLogger(l *Logger) {
if l == nil {
panic("can not set nil logger")
}
logger = l
}
// Info message with global logger
func Info(message string, kv ...interface{}) (int, error) {
return logger.Info(message, kv...)
}
// Notice message with global logger
func Notice(message string, kv ...interface{}) (int, error) {
return logger.Notice(message, kv...)
}
// Warning message with global logger
func Warning(message string, kv ...interface{}) (int, error) {
return logger.Warning(message, kv...)
}
// Error message with global logger
func Error(message string, kv ...interface{}) (int, error) {
return logger.Error(message, kv...)
}
// Fatal message with global logger
func Fatal(message string, kv ...interface{}) (int, error) {
return logger.Fatal(message, kv...)
}
// Debug message with global logger
func Debug(message string, kv ...interface{}) (int, error) {
return logger.Debug(message, kv...)
}
// Trace message with global logger
func Trace(message string, kv ...interface{}) (int, error) {
return logger.Trace(message, kv...)
}