/
writer.go
130 lines (104 loc) · 2.11 KB
/
writer.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
package logy
import (
"io"
"net"
"sync"
"sync/atomic"
)
type syncWriter struct {
discard atomic.Value
mu sync.Mutex
writer io.Writer
}
func newSyncWriter(writer io.Writer, discard bool) *syncWriter {
syncW := &syncWriter{
writer: writer,
}
syncW.discard.Store(discard)
return syncW
}
func (sw *syncWriter) setDiscarded(discarded bool) {
sw.discard.Store(discarded)
}
func (sw *syncWriter) isDiscarded() bool {
return sw.discard.Load().(bool)
}
func (sw *syncWriter) Write(p []byte) (n int, err error) {
if sw.isDiscarded() {
return 0, nil
}
defer sw.mu.Unlock()
sw.mu.Lock()
return sw.writer.Write(p)
}
type syslogWriter struct {
discard atomic.Value
mu sync.Mutex
writer net.Conn
network string
address string
retry bool
}
func newSyslogWriter(network, address string, retry bool, discarded bool) *syslogWriter {
syslogWriter := &syslogWriter{
network: network,
address: address,
retry: retry,
}
syslogWriter.discard.Store(discarded)
return syslogWriter
}
func (sw *syslogWriter) setDiscarded(discarded bool) {
sw.discard.Store(discarded)
}
func (sw *syslogWriter) isDiscarded() bool {
return sw.discard.Load().(bool)
}
func (sw *syslogWriter) connect() error {
if sw.writer != nil {
sw.writer.Close()
sw.writer = nil
}
con, err := net.Dial(sw.network, sw.address)
if err != nil {
return err
}
sw.writer = con
return nil
}
func (sw *syslogWriter) Write(p []byte) (n int, err error) {
if sw.isDiscarded() {
return 0, nil
}
defer sw.mu.Unlock()
sw.mu.Lock()
if sw.writer != nil {
return sw.writer.Write(p)
}
if !sw.retry {
return 0, nil
}
err = sw.connect()
if err != nil {
return 0, err
}
return sw.writer.Write(p)
}
type globalWriter struct {
logger *Logger
}
func newGlobalWriter(logger *Logger) *globalWriter {
return &globalWriter{
logger: logger,
}
}
func (w *globalWriter) Write(buf []byte) (n int, err error) {
if !w.logger.IsLoggable(LevelDebug) {
return 0, nil
}
origLen := len(buf)
if len(buf) > 0 && buf[len(buf)-1] == '\n' {
buf = buf[:len(buf)-1]
}
return origLen, w.logger.logDepth(3, nil, LevelDebug, string(buf))
}