/
logging.go
138 lines (110 loc) · 3.18 KB
/
logging.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
package pathfinder
import (
"io"
"os"
"runtime"
"time"
"github.com/sirupsen/logrus"
"github.com/x-cray/logrus-prefixed-formatter"
)
var Logger *logrus.Logger
var PanicLevel = logrus.PanicLevel
var FatalLevel = logrus.FatalLevel
var ErrorLevel = logrus.ErrorLevel
var WarnLevel = logrus.WarnLevel
var InfoLevel = logrus.InfoLevel
var DebugLevel = logrus.DebugLevel
var AllLevels = logrus.AllLevels
// WriterHook is a hook that writes logs of specified LogLevels to specified Writer
type LogHook struct {
Writer io.Writer
LogLevels []logrus.Level
Formatter logrus.Formatter
}
// Fire will be called when some logging function is called with current hook
// It will format log entry to string and write it to appropriate writer
func (hook *LogHook) Fire(entry *logrus.Entry) error {
line, err := hook.Formatter.Format(entry)
if err != nil {
return err
}
_, err = hook.Writer.Write(line)
return err
}
// Levels define on which log levels this hook would trigger
func (hook *LogHook) Levels() []logrus.Level {
return hook.LogLevels
}
func GetLogLevels(subset string) []logrus.Level {
switch subset {
case "all":
return AllLevels
case "error":
return []logrus.Level{ErrorLevel, FatalLevel, PanicLevel}
case "warn":
return []logrus.Level{WarnLevel, ErrorLevel, FatalLevel, PanicLevel}
case "info":
return []logrus.Level{InfoLevel, WarnLevel, ErrorLevel, FatalLevel, PanicLevel}
case "debug":
return []logrus.Level{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, FatalLevel, PanicLevel}
case "infoOnly":
return []logrus.Level{InfoLevel}
case "infoWarn":
return []logrus.Level{InfoLevel, WarnLevel}
}
return []logrus.Level{InfoLevel, WarnLevel, ErrorLevel, FatalLevel, PanicLevel}
}
func GetLogHook(writer io.Writer, logLevels []logrus.Level) *LogHook {
return &LogHook{Writer: writer, LogLevels: logLevels, Formatter: &logrus.JSONFormatter{TimestampFormat: time.RFC3339}}
}
func GetColoredFormatter() *prefixed.TextFormatter {
formatter := new(prefixed.TextFormatter)
formatter.FullTimestamp = true
formatter.SetColorScheme(&prefixed.ColorScheme{
PrefixStyle: "blue+b",
TimestampStyle: "white+h",
})
return formatter
}
func GetLogger() *logrus.Logger {
logger := logrus.New()
logger.Formatter = GetColoredFormatter()
logger.Level = logrus.InfoLevel
return logger
}
func AddLogHook(hook *LogHook) {
Logger.AddHook(hook)
}
func GetJsonLogger() *logrus.Logger {
logger := logrus.New()
formatter := new(logrus.JSONFormatter)
logger.Formatter = formatter
logger.Level = logrus.InfoLevel
return logger
}
func GetPosition(frameSkip int) (string, string, int) {
pc := make([]uintptr, 15)
n := runtime.Callers(2, pc)
frames := runtime.CallersFrames(pc[:n])
var frame runtime.Frame
for i := 0; i <= frameSkip; i++ {
frame, _ = frames.Next()
}
return frame.Function, frame.File, frame.Line
}
func GetLogFields(m map[string]interface{}) map[string]interface{} {
//function, file, line := GetPosition(1)
nm := make(map[string]interface{})
//nm["function"] = function
//nm["position"] = fmt.Sprintf("%s:%d", file, line)
for k, v := range m {
nm[k] = v
}
return nm
}
func init() {
Logger = GetLogger()
if os.Getenv("DEBUG") != "" {
Logger.SetLevel(DebugLevel)
}
}