diff options
| author | James Hunt <james.hunt@ubuntu.com> | 2015-03-19 10:29:09 +0000 |
|---|---|---|
| committer | James Hunt <james.hunt@ubuntu.com> | 2015-03-19 10:29:09 +0000 |
| commit | 85d84437114ab0dd9abb9ff497a55202e138812d (patch) | |
| tree | 9fbd1377ffe0e4c9bbe04ac185afb414724a23de /logger | |
| parent | 917ff1a3bc3b11ea6882f176c8d6f088cca3b757 (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.go | 30 | ||||
| -rw-r--r-- | logger/logger_test.go | 20 |
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 { |
