-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.go
130 lines (114 loc) · 2.39 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
package scpw
import (
"fmt"
"io"
"os"
"path"
"strings"
"sync"
"github.com/sirupsen/logrus"
)
var mu sync.Mutex
var loggers = make(map[string]*logHandle)
var syslogHook logrus.Hook
type logHandle struct {
logrus.Logger
name string
lvl *logrus.Level
colorful bool
}
func (l *logHandle) Format(e *logrus.Entry) ([]byte, error) {
lvl := e.Level
if l.lvl != nil {
lvl = *l.lvl
}
lvlStr := strings.ToUpper(lvl.String())
if l.colorful {
var color int
switch lvl {
case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:
color = 31 // RED
case logrus.WarnLevel:
color = 33 // YELLOW
case logrus.InfoLevel:
color = 34 // BLUE
default: // logrus.TraceLevel, logrus.DebugLevel
color = 35 // MAGENTA
}
lvlStr = fmt.Sprintf("\033[1;%dm%s\033[0m", color, lvlStr)
}
const timeFormat = "2006/01/02 15:04:05.000000"
timestamp := e.Time.Format(timeFormat)
str := fmt.Sprintf("%v %s[%d] <%v>: %v [%s:%d]",
timestamp,
l.name,
os.Getpid(),
lvlStr,
strings.TrimRight(e.Message, "\n"),
path.Base(e.Caller.File),
e.Caller.Line)
if len(e.Data) != 0 {
str += " " + fmt.Sprint(e.Data)
}
if !strings.HasSuffix(str, "\n") {
str += "\n"
}
return []byte(str), nil
}
func (l *logHandle) Log(args ...interface{}) {
l.Debugln(args...)
}
func newLogger(name string) *logHandle {
l := &logHandle{Logger: *logrus.New(), name: name, colorful: true}
l.Formatter = l
if syslogHook != nil {
l.AddHook(syslogHook)
}
l.SetReportCaller(true)
return l
}
// GetLogger returns a logger mapped to `name`
func GetLogger(name string) *logHandle {
mu.Lock()
defer mu.Unlock()
if logger, ok := loggers[name]; ok {
return logger
}
logger := newLogger(name)
loggers[name] = logger
return logger
}
// SetLogLevel sets Level to all the loggers in the map
func SetLogLevel(lvl logrus.Level) {
mu.Lock()
defer mu.Unlock()
for _, logger := range loggers {
logger.Level = lvl
}
}
func DisableLogColor() {
mu.Lock()
defer mu.Unlock()
for _, logger := range loggers {
logger.colorful = false
}
}
func SetOutFile(name string) {
file, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
return
}
mu.Lock()
defer mu.Unlock()
for _, logger := range loggers {
logger.SetOutput(file)
logger.colorful = false
}
}
func SetOutput(w io.Writer) {
mu.Lock()
defer mu.Unlock()
for _, logger := range loggers {
logger.SetOutput(w)
}
}