-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlog.go
134 lines (120 loc) · 2.44 KB
/
log.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
package logs
import (
"fmt"
"github.com/yzw/conf"
"io"
"io/ioutil"
"strings"
"time"
)
const (
levelDebug = iota
levelInfo
levelWarning
levelError
)
var (
c *config
log *logger
dateTimeFmt = "2006-01-02 15:04:05"
levelMap = map[int]string{
levelDebug: "DEBUG ",
levelInfo: "INFO ",
levelWarning: "WARNING",
levelError: "ERROR ",
}
logsChan = make(chan *logChan, 10000)
)
type logChan struct {
level int
msg []byte
}
type out struct {
level int
levelStr string
out io.Writer
}
type logger struct {
outs map[int]*out
}
func (l *logger) put(level int, str string) {
o, ok := l.outs[level]
if ok {
logsChan <- &logChan{level: level, msg: fmtMsg(o.levelStr, str)}
}
}
func (l *logger) write() {
var chLog *logChan
for {
chLog = <-logsChan
l.outs[chLog.level].out.Write(chLog.msg)
}
}
// Init
func Init(confFileName string) error {
// init config
c = &config{Level: "debug"}
b, err := ioutil.ReadFile(confFileName)
if err != nil {
return err
}
err = conf.Unmarshal(b, c)
if err != nil {
return err
}
// init datetime format
if c.DatetimeFmt != "" {
dateTimeFmt = c.DatetimeFmt
}
// init level and logger
level := levelDebug
switch strings.ToLower(c.Level) {
case "info":
level = levelInfo
case "warning":
level = levelWarning
case "error":
level = levelError
}
log = &logger{outs: make(map[int]*out, 0)}
enableMap := map[int]bool{
levelDebug: c.DebugEnable,
levelInfo: c.InfoEnable,
levelWarning: c.WarningEnable,
levelError: c.ErrorEnable,
}
typeMap := map[int]string{
levelDebug: c.DebugType,
levelInfo: c.InfoType,
levelWarning: c.WarningType,
levelError: c.ErrorType,
}
outMap := map[int]string{
levelDebug: c.DebugOut,
levelInfo: c.InfoOut,
levelWarning: c.WarningOut,
levelError: c.ErrorOut,
}
for i := level; i < 4; i++ {
if appendOut(i, levelMap[i], enableMap[i], typeMap[i], outMap[i]) != nil {
return err
}
}
go log.write()
return nil
}
func Close() {
time.Sleep(1 * time.Second)
}
func Debug(format string, a ...interface{}) {
log.put(levelDebug, Green(fmt.Sprintf(format, a...)))
}
func Info(format string, a ...interface{}) {
log.put(levelInfo, White(fmt.Sprintf(format, a...)))
}
func Warning(format string, a ...interface{}) {
log.put(levelWarning, Yellow(fmt.Sprintf(format, a...)))
}
func Error(format string, a ...interface{}) {
log.put(levelError, Red(fmt.Sprintf(format, a...)))
}