-
Notifications
You must be signed in to change notification settings - Fork 27
/
logger.go
119 lines (104 loc) · 3.03 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
package logger
import (
"fmt"
"io"
"log"
"os"
)
const (
NONE = 0
FATAL = 1
ERROR = 2
INFO = 3
DEBUG = 4
)
const cRed = "\u001b[31m"
const cReset = "\u001b[0m"
const (
strFATAL = cRed + "[FATAL] "
strERROR = cRed + "[ERROR] "
strINFO = "[INFO] "
strDEBUG = "[DEBUG] "
)
type Logger struct {
lvl int
prefix string
logDebug *log.Logger
logInfo *log.Logger
logError *log.Logger
logFatal *log.Logger
fWriter io.Writer
}
// Init - Initialize logging
func (l *Logger) Init(lvl int, prefix string) {
l.SetLevel(lvl)
l.prefix = prefix
l.logDebug = log.New(os.Stderr, prefix+": "+strDEBUG, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
l.logInfo = log.New(os.Stderr, prefix+": "+strINFO, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
l.logError = log.New(os.Stderr, prefix+": "+strERROR, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
l.logFatal = log.New(os.Stderr, prefix+": "+strFATAL, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
}
// SetLevel - Configures the log level. Higher the number more verbose.
func (l *Logger) SetLevel(lvl int) {
l.lvl = lvl
}
// syncPrefixes - syncs the logger prefixes
func syncPrefixes(maxPrefixLen int, loggers []*Logger) {
for _, lgr := range loggers {
if maxPrefixLen-len(lgr.prefix) > 0 {
lgr.prefix = fmt.Sprintf("%-*s", maxPrefixLen, lgr.prefix)
}
}
}
// SyncLoggers - syncs the loggers
func SyncLoggers(loggers []*Logger) {
maxPrefixLen := 0
for _, lgr := range loggers {
if len(lgr.prefix) > maxPrefixLen {
maxPrefixLen = len(lgr.prefix)
}
}
syncPrefixes(maxPrefixLen, loggers)
}
// SetLogFile - Writes log to the file. set verbose false disables log to os.Stderr
func (l *Logger) SetLogFile(logFile io.Writer, verbose bool) {
dLogs := []io.Writer{logFile}
iLogs := []io.Writer{logFile}
eLogs := []io.Writer{logFile}
fLogs := []io.Writer{logFile}
if verbose {
dLogs = append(dLogs, os.Stderr)
iLogs = append(iLogs, os.Stderr)
eLogs = append(eLogs, os.Stderr)
fLogs = append(fLogs, os.Stderr)
}
l.logDebug = log.New(io.MultiWriter(dLogs...), l.prefix+" "+strDEBUG, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
l.logInfo = log.New(io.MultiWriter(iLogs...), l.prefix+" "+strINFO, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
l.logError = log.New(io.MultiWriter(eLogs...), l.prefix+" "+strERROR, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
l.logFatal = log.New(io.MultiWriter(fLogs...), l.prefix+" "+strFATAL, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
}
func (l *Logger) Debug(v ...interface{}) {
if l.lvl >= DEBUG {
l.logDebug.Output(2, fmt.Sprint(v...))
}
}
func (l *Logger) Info(v ...interface{}) {
if l.lvl >= INFO {
l.logInfo.Output(2, fmt.Sprint(v...))
}
}
func (l *Logger) Error(v ...interface{}) {
if l.lvl >= ERROR {
l.logError.Output(2, fmt.Sprint(v...)+cReset)
}
}
func (l *Logger) Fatal(v ...interface{}) {
if l.lvl >= FATAL {
l.logFatal.Output(2, fmt.Sprint(v...)+cReset)
}
}
func (l *Logger) Close() {
if c, ok := l.fWriter.(io.Closer); ok && c != nil {
c.Close()
}
}