summaryrefslogtreecommitdiff
path: root/logger
diff options
authorJames Hunt <james.hunt@ubuntu.com>2015-03-19 10:29:09 +0000
committerJames Hunt <james.hunt@ubuntu.com>2015-03-19 10:29:09 +0000
commit85d84437114ab0dd9abb9ff497a55202e138812d (patch)
tree9fbd1377ffe0e4c9bbe04ac185afb414724a23de /logger
parent917ff1a3bc3b11ea6882f176c8d6f088cca3b757 (diff)
Review changes:
* Don't export LogWriterInterface. * newLogWriter(): Ensure that all objects share a single syslog connection.
Diffstat (limited to 'logger')
-rw-r--r--logger/logger.go30
-rw-r--r--logger/logger_test.go20
2 files changed, 40 insertions, 10 deletions
diff --git a/logger/logger.go b/logger/logger.go
index 6e238fb93c..0900f1f15f 100644
--- a/logger/logger.go
+++ b/logger/logger.go
@@ -5,6 +5,7 @@ import (
"log/syslog"
"runtime/debug"
"strings"
+ "sync"
"time"
"github.com/juju/loggo"
@@ -13,9 +14,9 @@ import (
// Name used in the prefix for all logged messages
const LoggerName = "snappy"
-// LogWriterInterface allows the tests to replace the syslog
+// logWriterInterface allows the tests to replace the syslog
// implementation.
-type LogWriterInterface interface {
+type logWriterInterface interface {
// syslog.Writer
Debug(m string) error
Info(m string) error
@@ -26,9 +27,15 @@ type LogWriterInterface interface {
// LogWriter object that handles writing log entries
type LogWriter struct {
- systemLog LogWriterInterface
+ systemLog logWriterInterface
}
+// Used to ensure that only a single connection to syslog is created
+var once sync.Once
+
+// A single connection to the system logger
+var syslogConnection logWriterInterface
+
// Write sends the log details specified by the params to the logging
// back-end (in this case syslog).
func (l *LogWriter) Write(level loggo.Level, name string, filename string, line int, timestamp time.Time, message string) {
@@ -91,22 +98,29 @@ func (l *LogWriter) Format(level loggo.Level, module, filename string, line int,
}
// A variable to make testing easier
-var getSyslog = func(priority syslog.Priority, tag string) (w LogWriterInterface, err error) {
+var getSyslog = func(priority syslog.Priority, tag string) (w logWriterInterface, err error) {
return syslog.New(syslog.LOG_NOTICE|syslog.LOG_LOCAL0, LoggerName)
}
-// newLogWriter creates a new LogWriter.
+// newLogWriter creates a new LogWriter, ensuring that only a single
+// connection to the system logger is created.
func newLogWriter() (l *LogWriter, err error) {
l = new(LogWriter)
- // Note that the log level here is just the default - Write()
- // will alter it as needed.
- l.systemLog, err = getSyslog(syslog.LOG_NOTICE|syslog.LOG_LOCAL0, LoggerName)
+ once.Do(func() {
+
+ // Note that the log level here is just the default - Write()
+ // will alter it as needed.
+ syslogConnection, err = getSyslog(syslog.LOG_NOTICE|syslog.LOG_LOCAL0, LoggerName)
+ })
+
if err != nil {
return nil, err
}
+ l.systemLog = syslogConnection
+
return l, nil
}
diff --git a/logger/logger_test.go b/logger/logger_test.go
index db5ed1cee9..45beb5d2db 100644
--- a/logger/logger_test.go
+++ b/logger/logger_test.go
@@ -27,7 +27,7 @@ type MockLogWriter struct {
var mockWriter *MockLogWriter
-func mockGetSyslog(priority syslog.Priority, tag string) (w LogWriterInterface, err error) {
+func mockGetSyslog(priority syslog.Priority, tag string) (w logWriterInterface, err error) {
mockWriter = &MockLogWriter{}
return mockWriter, nil
}
@@ -41,6 +41,8 @@ func readLines() (lines []string) {
if last == "" {
lines = lines[:length-1]
}
+ // clear the buffer to avoid contents accumulating indefinitely
+ mockWriter.buf.Reset()
return lines
}
@@ -92,10 +94,23 @@ func sliceContainsRegex(array []string, regex string) bool {
}
func (ts *LoggerTestSuite) TestNewLogWriter(c *C) {
- w, err := newLogWriter()
+ var w, w2 *LogWriter
+ var err error
+
+ w, err = newLogWriter()
c.Assert(err, IsNil)
c.Assert(w, Not(IsNil))
c.Assert(w.systemLog, Not(IsNil))
+
+ w2, err = newLogWriter()
+ c.Assert(err, IsNil)
+ c.Assert(w2, Not(IsNil))
+ c.Assert(w2.systemLog, Not(IsNil))
+
+ // There should be a single shared syslog connection, hence the
+ // systemLog objects should be identical.
+ c.Assert(w.systemLog, Equals, w2.systemLog)
+ c.Assert(w.systemLog, DeepEquals, w2.systemLog)
}
func (ts *LoggerTestSuite) TestWrite(c *C) {
@@ -190,6 +205,7 @@ func (ts *LoggerTestSuite) checkLogLevel(c *C, level, msg string) {
lines := readLines()
+
if expectBacktrace {
c.Assert(len(lines) > 1, Equals, true)
} else {