forked from thrasher-corp/gocryptotrader
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlogger.go
120 lines (107 loc) · 2.7 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
package logger
import (
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path"
"runtime"
"time"
)
func init() {
setDefaultOutputs()
}
// SetupLogger configure logger instance with user provided settings
func SetupLogger() (err error) {
if *Logger.Enabled {
err = setupOutputs()
if err != nil {
return
}
logLevel()
if Logger.ColourOutput {
colourOutput()
}
} else {
clearAllLoggers()
}
return
}
// setDefaultOutputs() this setups defaults used by the logger
// This allows it to be used without any user configuration
func setDefaultOutputs() {
debugLogger = log.New(os.Stdout,
"[DEBUG]: ",
log.Ldate|log.Ltime)
infoLogger = log.New(os.Stdout,
"[INFO]: ",
log.Ldate|log.Ltime)
warnLogger = log.New(os.Stdout,
"[WARN]: ",
log.Ldate|log.Ltime)
errorLogger = log.New(os.Stdout,
"[ERROR]: ",
log.Ldate|log.Ltime)
fatalLogger = log.New(os.Stdout,
"[FATAL]: ",
log.Ldate|log.Ltime)
}
// colorOutput() sets the prefix of each log type to matching colour
// TODO: add windows support
func colourOutput() {
if runtime.GOOS != "windows" || Logger.ColourOutputOverride {
debugLogger.SetPrefix("\033[34m[DEBUG]\033[0m: ")
infoLogger.SetPrefix("\033[32m[INFO]\033[0m: ")
warnLogger.SetPrefix("\033[33m[WARN]\033[0m: ")
errorLogger.SetPrefix("\033[31m[ERROR]\033[0m: ")
fatalLogger.SetPrefix("\033[31m[FATAL]\033[0m: ")
}
}
// clearAllLoggers() sets all logger flags to 0 and outputs to Discard
func clearAllLoggers() {
debugLogger.SetFlags(0)
infoLogger.SetFlags(0)
warnLogger.SetFlags(0)
errorLogger.SetFlags(0)
fatalLogger.SetFlags(0)
debugLogger.SetOutput(ioutil.Discard)
infoLogger.SetOutput(ioutil.Discard)
warnLogger.SetOutput(ioutil.Discard)
errorLogger.SetOutput(ioutil.Discard)
fatalLogger.SetOutput(ioutil.Discard)
}
// setupOutputs() sets up the io.writer to use for logging
// TODO: Fix up rotating at the moment its a quick job
func setupOutputs() (err error) {
if len(Logger.File) > 0 {
logFile := path.Join(LogPath, Logger.File)
if Logger.Rotate {
if _, err = os.Stat(logFile); !os.IsNotExist(err) {
currentTime := time.Now()
newName := currentTime.Format("2006-01-02 15-04-05")
newFile := newName + " " + Logger.File
err = os.Rename(logFile, path.Join(LogPath, newFile))
if err != nil {
err = fmt.Errorf("Failed to rename old log file %s", err)
return
}
}
}
logFileHandle, err = os.OpenFile(logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
return
}
logOutput = io.MultiWriter(os.Stdout, logFileHandle)
} else {
logOutput = os.Stdout
}
return
}
// CloseLogFile close the handler for any open log files
func CloseLogFile() (err error) {
if logFileHandle != nil {
err = logFileHandle.Close()
}
return
}