/
console_appender.go
106 lines (87 loc) · 2.26 KB
/
console_appender.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
package log4g
import (
"errors"
"fmt"
"io"
"os"
"github.com/jrivets/gorivets"
)
const consoleAppenderName = "log4g/consoleAppender"
// layout - appender setting to specify format of the log event to message
// transformation
const CAParamLayout = "layout"
// async - defines whether the appender will block the logging call, or do
// it asynchronously
const CAParamAsync = "async"
type consoleAppender struct {
layoutTemplate LayoutTemplate
async bool
}
type consoleAppenderFactory struct {
msgChannel chan string
out io.Writer
}
var caFactory *consoleAppenderFactory
func init() {
caFactory = &consoleAppenderFactory{make(chan string, 1000), os.Stdout}
err := RegisterAppender(caFactory)
if err != nil {
close(caFactory.msgChannel)
fmt.Println("It is impossible to register console appender: ", err)
panic(err)
}
go func() {
for {
str, ok := <-caFactory.msgChannel
if !ok {
break
}
caFactory.write(str)
}
}()
}
func (f *consoleAppenderFactory) write(str string) {
fmt.Fprint(f.out, str, "\n")
}
func (*consoleAppenderFactory) Name() string {
return consoleAppenderName
}
func (caf *consoleAppenderFactory) NewAppender(params map[string]string) (Appender, error) {
layout, ok := params[CAParamLayout]
if !ok || len(layout) == 0 {
return nil, errors.New("Cannot create console appender without specified layout")
}
layoutTemplate, err := ParseLayout(layout)
if err != nil {
return nil, errors.New("Cannot create console appender: " + err.Error())
}
asyncParam, ok := params[CAParamAsync]
var async bool = false
if ok && asyncParam != "" {
pasync, err := gorivets.ParseBool(asyncParam, true)
if err != nil {
async = pasync
}
}
return &consoleAppender{layoutTemplate, async}, nil
}
func (caf *consoleAppenderFactory) Shutdown() {
close(caf.msgChannel)
caFactory.msgChannel = nil
}
// Appender interface implementation
func (cAppender *consoleAppender) Append(event *Event) (ok bool) {
ok = false
defer gorivets.EndQuietly()
msg := ToLogMessage(event, cAppender.layoutTemplate)
if cAppender.async {
caFactory.msgChannel <- msg
} else {
caFactory.write(msg)
}
ok = caFactory.msgChannel != nil
return ok
}
func (cAppender *consoleAppender) Shutdown() {
// Nothing should be done for the console appender
}