Skip to content

Commit fe02c9f

Browse files
joeybloggsjoeybloggs
joeybloggs
authored and
joeybloggs
committed
updated syslog to use github.com/RackSec/srslog
- std lib syslog will no longer be maintained as per comment golang/go#13449 (comment) - TLS support is now available via new syslog package - Simplified Syslog New() function - eliminated some data races IN THE TESTS, NOT THE LIBRARY ITSELF
1 parent e40ca21 commit fe02c9f

20 files changed

+997
-29
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## log
22
<img align="right" src="https://raw.githubusercontent.com/go-playground/log/master/logo.png">
3-
![Project status](https://img.shields.io/badge/version-3.1.1-green.svg)
3+
![Project status](https://img.shields.io/badge/version-4.0.0-green.svg)
44
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/log/branches/master/badge.svg)](https://semaphoreci.com/joeybloggs/log)
55
[![Coverage Status](https://coveralls.io/repos/github/go-playground/log/badge.svg?branch=master)](https://coveralls.io/github/go-playground/log?branch=master)
66
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/log)](https://goreportcard.com/report/github.com/go-playground/log)
@@ -188,7 +188,7 @@ Pull requests for new handlers are welcome, please provide test coverage is all
188188
| Handler | Description | Docs |
189189
| ------- | ---- | ----------- |
190190
| console | Allows for log messages to be sent to a any writer, default os.Stderr | [![GoDoc](https://godoc.org/github.com/go-playground/log/handlers/console?status.svg)](https://godoc.org/github.com/go-playground/log/handlers/console) |
191-
| syslog | Allows for log messages to be sent via syslog. | [![GoDoc](https://godoc.org/github.com/go-playground/log/handlers/syslog?status.svg)](https://godoc.org/github.com/go-playground/log/handlers/syslog) |
191+
| syslog | Allows for log messages to be sent via syslog, includes TLS support. | [![GoDoc](https://godoc.org/github.com/go-playground/log/handlers/syslog?status.svg)](https://godoc.org/github.com/go-playground/log/handlers/syslog) |
192192
| http | Allows for log messages to be sent via http. Can use the HTTP handler as a base for creating other handlers requiring http transmission. | [![GoDoc](https://godoc.org/github.com/go-playground/log/handlers/http?status.svg)](https://godoc.org/github.com/go-playground/log/handlers/http) |
193193
| email | Allows for log messages to be sent via email. | [![GoDoc](https://godoc.org/github.com/go-playground/log/handlers/email?status.svg)](https://godoc.org/github.com/go-playground/log/handlers/email) |
194194
| hipchat | Allows for log messages to be sent to a hipchat room. | [![GoDoc](https://godoc.org/github.com/go-playground/log/handlers/http/hipchat?status.svg)](https://godoc.org/github.com/go-playground/log/handlers/http/hipchat) |

handlers/console/console.go

-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ func (c *Console) handleLog(entries <-chan *log.Entry) {
210210

211211
b = formatter(e)
212212
c.writer.Write(b)
213-
// b.WriteTo(c.writer)
214213

215214
e.Consumed()
216215
}

handlers/console/console_test.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
44
"bytes"
55
stdlog "log"
66
"strings"
7+
"sync"
78
"testing"
9+
"time"
810

911
"github.com/go-playground/log"
1012
)
@@ -13,15 +15,13 @@ import (
1315
// - Run "go test" to run tests
1416
// - Run "gocov test | gocov report" to report on test converage by file
1517
// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called
16-
18+
//
1719
// or
18-
1920
// -- may be a good idea to change to output path to somewherelike /tmp
2021
// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html
2122

2223
func TestConsoleLogger(t *testing.T) {
2324
tests := getConsoleLoggerTests()
24-
2525
buff := new(bytes.Buffer)
2626

2727
cLog := New()
@@ -276,21 +276,36 @@ func TestSetFilenameColor(t *testing.T) {
276276

277277
func TestConsoleSTDLogCapturing(t *testing.T) {
278278

279+
var m sync.Mutex
279280
buff := new(bytes.Buffer)
280281

281282
cLog := New()
282-
cLog.SetWriter(buff)
283283
cLog.SetDisplayColor(false)
284284
cLog.SetBuffersAndWorkers(3, 3)
285285
cLog.SetTimestampFormat("MST")
286286
cLog.RedirectSTDLogOutput(true)
287+
cLog.SetFormatFunc(func(c *Console) Formatter {
288+
return func(e *log.Entry) []byte {
289+
m.Lock()
290+
defer m.Unlock()
291+
buff.Write([]byte(e.Message))
292+
293+
return buff.Bytes()
294+
}
295+
})
296+
287297
log.RegisterHandler(cLog, log.AllLevels...)
288298

289299
stdlog.Println("STD LOG message")
290300

301+
time.Sleep(500 * time.Millisecond)
302+
303+
m.Lock()
291304
s := buff.String()
305+
m.Unlock()
292306

293-
expected := "STD LOG message stdlog=true"
307+
// expected := "STD LOG message stdlog=true"
308+
expected := "STD LOG message"
294309

295310
if !strings.Contains(s, expected) {
296311
t.Errorf("Expected '%s' Got '%s'", expected, s)

handlers/email/email.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"html/template"
66
stdlog "log"
77
"os"
8+
"sync"
89
"time"
910

1011
"gopkg.in/gomail.v2"
@@ -59,6 +60,7 @@ type Email struct {
5960
from string
6061
to []string
6162
keepalive time.Duration
63+
m sync.Mutex
6264
}
6365

6466
// New returns a new instance of the email logger
@@ -192,10 +194,19 @@ func (email *Email) Run() chan<- *log.Entry {
192194
func defaultFormatFunc(email *Email) Formatter {
193195
var err error
194196
b := new(bytes.Buffer)
197+
198+
// apparently there is a race condition when I was using
199+
// email.to... below in the SetHeader for whatever reason
200+
// so copying the "to" values solves the issue
201+
// I wonder if it's a flase positive in the race detector.....
202+
to := make([]string, len(email.to), len(email.to))
203+
copy(to, email.to)
204+
195205
template := email.Template()
196206
message := gomail.NewMessage()
207+
197208
message.SetHeader("From", email.from)
198-
message.SetHeader("To", email.to...)
209+
message.SetHeader("To", to...)
199210

200211
return func(e *log.Entry) *gomail.Message {
201212
b.Reset()

handlers/email/email_test.go

+17-5
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,15 @@ func TestEmailHandler(t *testing.T) {
118118

119119
defer server.Close()
120120

121+
proceed := make(chan struct{})
122+
defer close(proceed)
123+
121124
go func() {
122125
for {
123126
conn, err := server.Accept()
124127
if err != nil {
125-
t.Errorf("Expected <nil> Got '%s'", err)
128+
msg = ""
129+
break
126130
}
127131

128132
if conn == nil {
@@ -138,11 +142,15 @@ func TestEmailHandler(t *testing.T) {
138142
}
139143

140144
msg = handleClient(c, false)
145+
146+
proceed <- struct{}{}
141147
}
142148
}()
143149

144150
log.Debug("debug")
145151

152+
<-proceed
153+
146154
for i, tt := range tests {
147155
if !strings.Contains(msg, tt.expected) {
148156
t.Errorf("Index %d Expected '%s' Got '%s'", i, tt.expected, msg)
@@ -155,6 +163,8 @@ func TestEmailHandler(t *testing.T) {
155163

156164
log.Debug("debug")
157165

166+
<-proceed
167+
158168
for i, tt := range tests {
159169
if !strings.Contains(msg, tt.expected) {
160170
t.Errorf("Index %d Expected '%s' Got '%s'", i, tt.expected, msg)
@@ -195,7 +205,7 @@ func TestBadSend(t *testing.T) {
195205
for {
196206
conn, err := server.Accept()
197207
if err != nil {
198-
t.Errorf("Expected <nil> Got '%s'", err)
208+
break
199209
}
200210

201211
if conn == nil {
@@ -220,12 +230,14 @@ func TestBadSend(t *testing.T) {
220230
func testFormatFunc(email *Email) Formatter {
221231
var err error
222232
b := new(bytes.Buffer)
223-
message := gomail.NewMessage()
224-
message.SetHeader("From", email.From())
225-
message.SetHeader("To", email.To()...)
226233

227234
return func(e *log.Entry) *gomail.Message {
228235
b.Reset()
236+
237+
message := gomail.NewMessage()
238+
message.SetHeader("From", email.From())
239+
message.SetHeader("To", email.To()...)
240+
229241
if err = email.template.ExecuteTemplate(b, "email", e); err != nil {
230242
log.WithFields(log.F("error", err)).Error("Error parsing Email handler template")
231243
}

handlers/syslog/doc.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ Package syslog allows for log messages to be sent via syslog.
33
44
Example
55
6-
NOTE: currently syslog uses the std library's syslog
6+
NOTE: syslog uses github.com/RackSec/srslog as the stdlib syslog
7+
is no longer being maintained or added to as of this discussion
8+
https://github.com/golang/go/issues/13449#issuecomment-161204716
79
810
package main
911

handlers/syslog/syslog.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package syslog
22

33
import (
4+
"crypto/tls"
45
"fmt"
56
stdlog "log"
6-
"log/syslog"
77
"os"
88
"strconv"
99

10+
syslog "github.com/RackSec/srslog"
11+
1012
"github.com/go-playground/log"
1113
)
1214

@@ -56,8 +58,10 @@ var (
5658
)
5759

5860
// New returns a new instance of the syslog logger
59-
// example: syslog.New("udp", "localhost:514", syslog.LOG_DEBUG, "")
60-
func New(network string, raddr string, priority syslog.Priority, tag string) (*Syslog, error) {
61+
// example: syslog.New("udp", "localhost:514", syslog.LOG_DEBUG, "", nil)
62+
// NOTE: tlsConfig param is optional and only applies when networks in "tcp+tls"
63+
// see TestSyslogTLS func tion int syslog_test.go for an example usage of tlsConfig parameter
64+
func New(network string, raddr string, tag string, tlsConfig *tls.Config) (*Syslog, error) {
6165

6266
var err error
6367

@@ -71,7 +75,14 @@ func New(network string, raddr string, priority syslog.Priority, tag string) (*S
7175
formatFunc: defaultFormatFunc,
7276
}
7377

74-
if s.writer, err = syslog.Dial(network, raddr, priority, tag); err != nil {
78+
// if non-TLS
79+
if tlsConfig == nil {
80+
s.writer, err = syslog.Dial(network, raddr, syslog.LOG_INFO, tag)
81+
} else {
82+
s.writer, err = syslog.DialWithTLSConfig(network, raddr, syslog.LOG_INFO, tag, tlsConfig)
83+
}
84+
85+
if err != nil {
7586
return nil, err
7687
}
7788

0 commit comments

Comments
 (0)