/
logger.go
153 lines (125 loc) · 3.06 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 logger
import (
"github.com/hetianyi/easygo/base"
"github.com/mattn/go-colorable"
"io"
"os"
"sync"
"time"
)
type LogLevel int
const (
LevelDebug LogLevel = iota
LevelInfo
LevelWarn
LevelError
LevelFatal
)
var (
levelNameMapping = []string{"debug", "info", "warn", "error", "fatal"}
levelShortNameMapping = []string{"D", "I", "W", "E", "F"}
)
type logger struct {
Out io.Writer
ColorableOutput bool // 是否打印彩色输出
lock sync.Mutex
Prefix string
Level LogLevel
callLevel int
formatter Formatter
}
type Formatter func(l *logger, t time.Time, level LogLevel, v ...interface{})
// New 初始化一个日志实例
func New(out io.Writer, colorableOutput bool, prefix string, level LogLevel, formatter Formatter) *logger {
return &logger{
Out: out,
ColorableOutput: colorableOutput,
Prefix: prefix,
Level: level,
callLevel: 4,
formatter: base.TValue(formatter == nil, DefaultFormatter, formatter).(Formatter),
}
}
// newDefaultLogger 初始化一个默认日志实例
func newDefaultLogger() *logger {
return &logger{
Out: colorable.NewColorableStdout(),
ColorableOutput: true,
callLevel: 5,
Level: LevelInfo,
formatter: DefaultFormatter,
}
}
// Info 以Info级别打印日志
func (l *logger) output(level LogLevel, v ...interface{}) {
// 日志级别低于设置的级别,则不处理
if level < l.Level {
return
}
l.formatter(l, time.Now(), level, v...)
}
// SetOut 设置日志输入
func (l *logger) SetOut(out io.Writer) {
l.lock.Lock()
defer l.lock.Unlock()
l.Out = out
}
// SetColorable 设置是否打印彩色日志
//
// 如果是自定义的formatter,则需要自行实现彩色输出
func (l *logger) SetColorable(colorable bool) {
l.lock.Lock()
defer l.lock.Unlock()
l.ColorableOutput = colorable
}
// SetFormatter 设置日志格式器
func (l *logger) SetFormatter(formatter Formatter) {
l.lock.Lock()
defer l.lock.Unlock()
l.formatter = formatter
}
// SetPrefix 设置日志前缀
func (l *logger) SetPrefix(prefix string) {
l.lock.Lock()
defer l.lock.Unlock()
l.Prefix = prefix
}
// Debug 以Debug级别打印日志
func (l *logger) Debug(v ...interface{}) {
l.lock.Lock()
defer l.lock.Unlock()
l.output(LevelDebug, v...)
}
// Info 以Info级别打印日志
func (l *logger) Info(v ...interface{}) {
l.lock.Lock()
defer l.lock.Unlock()
l.output(LevelInfo, v...)
}
// Warn 以Warn级别打印日志
func (l *logger) Warn(v ...interface{}) {
l.lock.Lock()
defer l.lock.Unlock()
l.output(LevelWarn, v...)
}
// Error 以Error级别打印日志
func (l *logger) Error(v ...interface{}) {
l.lock.Lock()
defer l.lock.Unlock()
l.output(LevelError, v...)
}
// Fatal 以Fatal级别打印日志
func (l *logger) Fatal(v ...interface{}) {
l.lock.Lock()
defer l.lock.Unlock()
l.output(LevelFatal, v...)
os.Exit(1)
}
func ParseLevel(levelName string) LogLevel {
for i, v := range levelNameMapping {
if v == levelName {
return LogLevel(i)
}
}
return LevelInfo
}