-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconsole_logger.go
More file actions
157 lines (131 loc) · 3.75 KB
/
console_logger.go
File metadata and controls
157 lines (131 loc) · 3.75 KB
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Package gomolconsole implements a console logger for gomol.
package gomolconsole
import (
"errors"
"fmt"
"io"
"os"
"time"
"github.com/aphistic/gomol"
"github.com/mgutz/ansi"
)
type ConsoleLoggerConfig struct {
// Colorize specifies whether the output will include ANSI colors or not. Defaults to true
Colorize bool
// Writer is the io.Writer to be used if not overridden in other options. Defaults to os.Stdout
Writer io.Writer
// DebugWriter is the io.Writer debug messages will be written to. Defaults to Writer
DebugWriter io.Writer
// InfoWriter is the io.Writer info messages will be written to. Defaults to Writer
InfoWriter io.Writer
// WarningWriter is the io.Writer warning messages will be written to. Defaults to Writer
WarningWriter io.Writer
// ErrorWriter is the io.Writer error messages will be written to. Defaults to Writer
ErrorWriter io.Writer
// FatalWriter is the io.Writer fatal messages will be written to. Defaults to Writer
FatalWriter io.Writer
}
type ConsoleLogger struct {
base *gomol.Base
writers map[gomol.LogLevel]io.Writer
tpl *gomol.Template
isInitialized bool
config *ConsoleLoggerConfig
}
type consoleWriter interface {
Print(msg string)
}
func NewConsoleLoggerConfig() *ConsoleLoggerConfig {
return &ConsoleLoggerConfig{
Colorize: true,
}
}
func NewConsoleLogger(config *ConsoleLoggerConfig) (*ConsoleLogger, error) {
if config == nil {
config = NewConsoleLoggerConfig()
}
l := &ConsoleLogger{
writers: make(map[gomol.LogLevel]io.Writer),
tpl: NewTemplateDefault(),
config: config,
}
l.populateWriters(config)
return l, nil
}
var printclean = func(msg string) string {
return msg
}
var printdbg = ansi.ColorFunc("cyan")
var printinfo = ansi.ColorFunc("green")
var printwarn = ansi.ColorFunc("yellow")
var printerr = ansi.ColorFunc("red")
var printfatal = ansi.ColorFunc("red+b")
func (l *ConsoleLogger) populateWriters(cfg *ConsoleLoggerConfig) {
var defaultWriter io.Writer = os.Stdout
if cfg.Writer != nil {
defaultWriter = cfg.Writer
}
l.writers[gomol.LevelDebug] = defaultWriter
l.writers[gomol.LevelInfo] = defaultWriter
l.writers[gomol.LevelWarning] = defaultWriter
l.writers[gomol.LevelError] = defaultWriter
l.writers[gomol.LevelFatal] = defaultWriter
if cfg.DebugWriter != nil {
l.writers[gomol.LevelDebug] = cfg.DebugWriter
}
if cfg.InfoWriter != nil {
l.writers[gomol.LevelInfo] = cfg.InfoWriter
}
if cfg.WarningWriter != nil {
l.writers[gomol.LevelWarning] = cfg.WarningWriter
}
if cfg.ErrorWriter != nil {
l.writers[gomol.LevelError] = cfg.ErrorWriter
}
if cfg.FatalWriter != nil {
l.writers[gomol.LevelFatal] = cfg.FatalWriter
}
}
func (l *ConsoleLogger) SetBase(base *gomol.Base) {
l.base = base
}
func (l *ConsoleLogger) SetTemplate(tpl *gomol.Template) error {
if tpl == nil {
return errors.New("A template must be provided")
}
l.tpl = tpl
return nil
}
func (l *ConsoleLogger) InitLogger() error {
l.isInitialized = true
return nil
}
func (l *ConsoleLogger) IsInitialized() bool {
return l.isInitialized
}
func (l *ConsoleLogger) ShutdownLogger() error {
l.isInitialized = false
return nil
}
func (l *ConsoleLogger) Logm(timestamp time.Time, level gomol.LogLevel, attrs map[string]interface{}, msg string) error {
mergedAttrs := make(map[string]interface{})
if l.base != nil && l.base.BaseAttrs != nil {
for key, val := range l.base.BaseAttrs.Attrs() {
mergedAttrs[key] = val
}
}
for key, val := range attrs {
mergedAttrs[key] = val
}
nMsg := gomol.NewTemplateMsg(timestamp, level, mergedAttrs, msg)
out, err := l.tpl.Execute(nMsg, l.config.Colorize)
if err != nil {
return err
}
w, ok := l.writers[level]
if !ok {
return fmt.Errorf("unsupported log level")
}
w.Write([]byte(out + "\n"))
return nil
}