/
logger.go
65 lines (52 loc) · 1.37 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
package logger
import (
"encoding/json"
"io"
"os"
"strconv"
gklog "github.com/go-kit/kit/log"
)
// herbertLogger is a logging service wrapping gokit and custom logging logic
type herbertLogger struct {
log gklog.Logger
writer io.Writer
level LogLevel
}
// LogLevel represents the atreides logging level
type LogLevel int
const (
VERBOSE LogLevel = iota + 1
ERROR
)
// NewHerbertFormatLogger returns a wrapped gokit logger
func NewHerbertFormatLogger(log gklog.Logger, file string, level LogLevel) gklog.Logger {
f, _ := os.OpenFile(file, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
return &herbertLogger{log: log, writer: f, level: level}
}
// Log writes a log entry
func (l *herbertLogger) Log(keyvals ...interface{}) error {
var logData map[string]string
logData = make(map[string]string)
logData["channel"] = "golang"
var hasError = false
for i := 0; i < len(keyvals); i += 2 {
key := keyvals[i].(string)
val := keyvals[i+1]
switch val.(type) {
case string:
logData[key] = val.(string)
case int:
logData[key] = strconv.Itoa(val.(int))
case bool:
logData[key] = strconv.FormatBool(val.(bool))
case error:
hasError = true
logData[key] = val.(error).Error()
}
}
serialized, _ := json.Marshal(logData)
if l.level == VERBOSE || (l.level == ERROR && hasError) {
l.writer.Write(append(serialized, '\n'))
}
return l.log.Log(keyvals...)
}