-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlogger.go
116 lines (99 loc) · 2.16 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
package vlog
import (
"fmt"
"os"
"time"
"github.com/fatih/color"
"github.com/go-co-op/gocron"
)
type Tag string
const (
LogTagDebug Tag = "DBG"
LogTagInfo Tag = "INF"
LogTagWarn Tag = "WRN"
LogTagError Tag = "ERR"
LogTagRequest Tag = "REQ"
)
type Logger struct {
outputs *[]Output
scheduler *gocron.Scheduler
}
func New(opts ...func(l *Logger)) *Logger {
l := &Logger{
outputs: &[]Output{},
}
for _, opt := range opts {
opt(l)
}
l.startCron()
return l
}
func (l *Logger) Close() {
for _, output := range *l.outputs {
err := output.close()
if err != nil {
_, _ = fmt.Fprint(os.Stderr, err.Error())
}
}
l.stopCron()
}
func (l *Logger) Debug(msg string, fields ...KeyValue) {
if os.Getenv("DEBUG") == "" {
return
}
l.print(color.FgWhite, LogTagDebug, msg, fields...)
}
func (l *Logger) Info(msg string, fields ...KeyValue) {
l.print(color.FgBlue, LogTagInfo, msg, fields...)
}
func (l *Logger) Warn(msg string, fields ...KeyValue) {
l.print(color.FgYellow, LogTagWarn, msg, fields...)
}
func (l *Logger) Error(err error, fields ...KeyValue) {
l.print(color.FgRed, LogTagError, err.Error(), fields...)
}
func (l *Logger) Request(msg string, fields ...KeyValue) {
l.print(color.FgGreen, LogTagRequest, msg, fields...)
}
func (l *Logger) Raw(msg string) {
for _, output := range *l.outputs {
output.printRaw(msg)
}
}
func (l *Logger) print(color color.Attribute, tag Tag, msg string, fields ...KeyValue) {
for _, output := range *l.outputs {
output.print(&Line{
color: color,
now: time.Now(),
tag: tag,
msg: msg,
fields: fields,
})
}
}
func (l *Logger) startCron() {
l.scheduler = gocron.NewScheduler(time.Local)
_, err := l.scheduler.Every(1).Day().At("00:00").Do(func() {
for _, output := range *l.outputs {
err := output.close()
if err != nil {
_, _ = fmt.Fprint(os.Stderr, err.Error())
continue
}
err = output.open()
if err != nil {
_, _ = fmt.Fprint(os.Stderr, err.Error())
continue
}
}
})
if err != nil {
_, _ = fmt.Fprint(os.Stderr, err.Error())
return
}
l.scheduler.StartAsync()
}
func (l *Logger) stopCron() {
l.scheduler.Stop()
l.scheduler = nil
}