-
Notifications
You must be signed in to change notification settings - Fork 1
/
log.go
141 lines (117 loc) · 3.26 KB
/
log.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
139
140
141
package log
import (
"errors"
"github.com/spf13/viper"
)
// A global variable so that log functions can be directly accessed
var Log Logger
//Fields Type to pass when we want to call WithFields for structured logging
type Fields map[string]interface{}
// Define a type for parameters in functions
type LoggerLevel string
const (
//Debug has verbose message
Debug = "debug"
//Info is default log level
Info = "info"
//Warn is for logging messages about possible issues
Warn = "warn"
//Error is for logging errors
Error = "error"
//Fatal is for logging fatal messages. The system shutdown after logging the message.
Fatal = "fatal"
)
type LoggerInstance int
const (
InstanceZapLogger LoggerInstance = iota
InstanceLogrusLogger
)
// expose the default logger in a variable.
// TODO add a config to change it at runtime? overkill
const DefaultLogger = InstanceZapLogger
var (
errInvalidLoggerInstance = errors.New("Invalid logger instance")
)
//Logger is our contract for the logger
type Logger interface {
Debugf(format string, args ...interface{})
Infof(format string, args ...interface{})
Warnf(format string, args ...interface{})
Errorf(format string, args ...interface{})
Fatalf(format string, args ...interface{})
Panicf(format string, args ...interface{})
WithFields(keyValues Fields) Logger
}
// Configuration stores the config for the logger
// For some loggers there can only be one level across writers, for such the level of Console is picked by default
type Configuration struct {
// stdOut logging
EnableConsole bool
ConsoleJSONFormat bool
ConsoleLevel LoggerLevel
Color bool
// file logging
EnableFile bool
FileJSONFormat bool
FileLevel LoggerLevel
FileLocation string
}
// Creates a new logger config based on viper config settings.
func NewConfig(conf *viper.Viper) *Configuration {
// we use viper as argument so that project's that don't use a global
// viper config can create a temporary object for this call
logLevel := NormalizeLogLevel(conf.GetString("Log.Level"))
return &Configuration{
EnableConsole: true,
ConsoleJSONFormat: conf.GetBool("Log.JSON"),
Color: conf.GetBool("Log.Color"),
ConsoleLevel: logLevel,
EnableFile: conf.GetBool("Log.EnableFile"),
FileJSONFormat: conf.GetBool("Log.JSON"),
FileLevel: logLevel,
FileLocation: "log.log", // in working dir
}
}
// NewLogger returns an instance of logger
func NewLogger(config *Configuration, loggerInstance LoggerInstance) (Logger, error) {
var err error
var logger Logger
switch loggerInstance {
case InstanceZapLogger:
logger, err = newZapLogger(*config)
if err != nil {
return nil, err
}
break
/*
case InstanceLogrusLogger:
logger, err = newLogrusLogger(*config)
if err != nil {
return nil, err
}
break
*/
default:
return nil, errInvalidLoggerInstance
}
Log = logger
return logger, nil
}
func NormalizeLogLevel(logLevel string) LoggerLevel {
var nomalizedLogLevel LoggerLevel
switch logLevel {
case "info":
nomalizedLogLevel = Info
case "debug":
nomalizedLogLevel = Debug
case "warn":
nomalizedLogLevel = Warn
case "error":
nomalizedLogLevel = Error
case "fatal":
nomalizedLogLevel = Fatal
default:
nomalizedLogLevel = Debug
}
return nomalizedLogLevel
}