...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package logger
16
17 import (
18 "io"
19 "net"
20 "strconv"
21 "time"
22 )
23
24
25 const (
26 DefaultSyslogPort = 514
27 DefaultSyslogVersion = 1
28 DefaultSyslogNetwork = "udp"
29 DefaultSyslogAddress = "localhost"
30 DefaultSyslogTimeout = 100 * time.Millisecond
31 DefaultSyslogFormat = "<{syslogPriority}>{syslogVersion} {iso8601} {address} {name} {pid} {id} - " +
32 "{file}:{line}:{function}(): {message}"
33 DefaultSyslogFacility = 1
34 )
35
36
37
38 type Syslog struct {
39 port int
40 version int
41 network string
42 address string
43 facility int
44 timeout time.Duration
45 stream *Stream
46 }
47
48
49 func NewSyslog() *Syslog {
50 s := &Syslog{
51 port: DefaultSyslogPort,
52 version: DefaultSyslogVersion,
53 network: DefaultSyslogNetwork,
54 address: DefaultSyslogAddress,
55 facility: DefaultSyslogFacility,
56 timeout: DefaultSyslogTimeout,
57 stream: NewStream(),
58 }
59
60 s.stream.GetFormatter().SetFormat(DefaultSyslogFormat)
61 s.stream.SetOpener(s)
62
63 return s
64 }
65
66
67 func (s *Syslog) Open() (io.WriteCloser, error) {
68 address := s.address + ":" + strconv.Itoa(s.port)
69
70 if s.timeout != 0 {
71 return net.DialTimeout(s.network, address, s.timeout)
72 }
73
74 return net.Dial(s.network, address)
75 }
76
77
78 func (s *Syslog) Enable() Handler {
79 return s.stream.Enable()
80 }
81
82
83 func (s *Syslog) Disable() Handler {
84 return s.stream.Disable()
85 }
86
87
88 func (s *Syslog) IsEnabled() bool {
89 return s.stream.IsEnabled()
90 }
91
92
93 func (s *Syslog) SetFormatter(formatter *Formatter) Handler {
94 return s.stream.SetFormatter(formatter)
95 }
96
97
98 func (s *Syslog) GetFormatter() *Formatter {
99 return s.stream.GetFormatter()
100 }
101
102
103 func (s *Syslog) SetLevel(level int) Handler {
104 return s.stream.SetLevel(level)
105 }
106
107
108 func (s *Syslog) SetMinimumLevel(level int) Handler {
109 return s.stream.SetMinimumLevel(level)
110 }
111
112
113 func (s *Syslog) GetMinimumLevel() int {
114 return s.stream.GetMinimumLevel()
115 }
116
117
118 func (s *Syslog) SetMaximumLevel(level int) Handler {
119 return s.stream.SetMaximumLevel(level)
120 }
121
122
123 func (s *Syslog) GetMaximumLevel() int {
124 return s.stream.GetMaximumLevel()
125 }
126
127
128 func (s *Syslog) SetLevelRange(min, max int) Handler {
129 return s.stream.SetLevelRange(min, max)
130 }
131
132
133 func (s *Syslog) GetLevelRange() (min, max int) {
134 return s.stream.GetLevelRange()
135 }
136
137
138 func (s *Syslog) SetPort(port int) *Syslog {
139 s.stream.Lock()
140 defer s.stream.Unlock()
141
142 if port <= 0 {
143 port = DefaultSyslogPort
144 }
145
146 if s.port != port {
147 s.port = port
148 s.stream.Reopen()
149 }
150
151 return s
152 }
153
154
155 func (s *Syslog) GetPort() int {
156 s.stream.RLock()
157 defer s.stream.RUnlock()
158
159 return s.port
160 }
161
162
163 func (s *Syslog) SetTimeout(timeout time.Duration) *Syslog {
164 s.stream.Lock()
165 defer s.stream.Unlock()
166
167 if s.timeout != timeout {
168 s.timeout = timeout
169 s.stream.Reopen()
170 }
171
172 return s
173 }
174
175
176 func (s *Syslog) GetTimeout() time.Duration {
177 s.stream.RLock()
178 defer s.stream.RUnlock()
179
180 return s.timeout
181 }
182
183
184
185 func (s *Syslog) SetNetwork(network string) *Syslog {
186 s.stream.Lock()
187 defer s.stream.Unlock()
188
189 if network == "" {
190 network = DefaultSyslogNetwork
191 }
192
193 if s.network != network {
194 s.network = network
195 s.stream.Reopen()
196 }
197
198 return s
199 }
200
201
202
203 func (s *Syslog) GetNetwork() string {
204 s.stream.RLock()
205 defer s.stream.RUnlock()
206
207 return s.network
208 }
209
210
211
212 func (s *Syslog) SetAddress(address string) *Syslog {
213 s.stream.Lock()
214 defer s.stream.Unlock()
215
216 if address == "" {
217 address = DefaultSyslogAddress
218 }
219
220 if s.address != address {
221 s.address = address
222 s.stream.Reopen()
223 }
224
225 return s
226 }
227
228
229
230 func (s *Syslog) GetAddress() string {
231 s.stream.RLock()
232 defer s.stream.RUnlock()
233
234 return s.network
235 }
236
237
238 func (s *Syslog) Emit(record *Record) error {
239 s.stream.GetFormatter().AddFuncs(s.getRecordFuncs(record))
240
241 return s.stream.Emit(record)
242 }
243
244
245 func (s *Syslog) Close() error {
246 return s.stream.Close()
247 }
248
249
250
251 func (s *Syslog) getRecordFuncs(record *Record) FormatterFuncs {
252 return FormatterFuncs{
253 "syslogVersion": func() int {
254 return s.version
255 },
256 "syslogPriority": func() int {
257 severities := [8]int{
258 FatalLevel,
259 AlertLevel,
260 CriticalLevel,
261 ErrorLevel,
262 WarningLevel,
263 NoticeLevel,
264 InfoLevel,
265 DebugLevel,
266 }
267
268 severity := 0
269
270 for i, level := range severities {
271 if level <= record.Level.Value {
272 severity = i
273 break
274 }
275 }
276
277 return ((0x1F & s.facility) << 3) | (0x07 & severity)
278 },
279 }
280 }
281
View as plain text