summaryrefslogtreecommitdiff
path: root/logger
diff options
Diffstat (limited to 'logger')
-rw-r--r--logger/export_test.go27
-rw-r--r--logger/logger.go59
-rw-r--r--logger/logger_test.go90
3 files changed, 66 insertions, 110 deletions
diff --git a/logger/export_test.go b/logger/export_test.go
new file mode 100644
index 0000000000..cd238bf7c2
--- /dev/null
+++ b/logger/export_test.go
@@ -0,0 +1,27 @@
+// -*- Mode: Go; indent-tabs-mode: t -*-
+
+/*
+ * Copyright (C) 2014,2015,2017 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package logger
+
+func GetLogger() Logger {
+ lock.Lock()
+ defer lock.Unlock()
+
+ return logger
+}
diff --git a/logger/logger.go b/logger/logger.go
index 6730b07e1c..216aa79ad7 100644
--- a/logger/logger.go
+++ b/logger/logger.go
@@ -1,7 +1,7 @@
// -*- Mode: Go; indent-tabs-mode: t -*-
/*
- * Copyright (C) 2014-2015 Canonical Ltd
+ * Copyright (C) 2014,2015,2017 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
@@ -22,9 +22,7 @@ package logger
import (
"fmt"
"io"
- "io/ioutil"
"log"
- "log/syslog"
"os"
"sync"
@@ -42,10 +40,6 @@ type Logger interface {
const (
// DefaultFlags are passed to the default console log.Logger
DefaultFlags = log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile
- // SyslogFlags are passed to the default syslog log.Logger
- SyslogFlags = log.Lshortfile
- // SyslogPriority for the default syslog log.Logger
- SyslogPriority = syslog.LOG_DEBUG | syslog.LOG_USER
)
type nullLogger struct{}
@@ -100,59 +94,32 @@ func SetLogger(l Logger) {
logger = l
}
-// ConsoleLog sends Notices to a log.Logger and Debugs to syslog
-type ConsoleLog struct {
+type Log struct {
log *log.Logger
- sys *log.Logger
}
-// Debug sends the msg to syslog
-func (l *ConsoleLog) Debug(msg string) {
- s := "DEBUG: " + msg
- l.sys.Output(3, s)
-
+// Debug only prints if SNAPD_DEBUG is set
+func (l Log) Debug(msg string) {
if osutil.GetenvBool("SNAPD_DEBUG") {
- l.log.Output(3, s)
+ l.log.Output(3, "DEBUG: "+msg)
}
}
// Notice alerts the user about something, as well as putting it syslog
-func (l *ConsoleLog) Notice(msg string) {
- l.sys.Output(3, msg)
+func (l Log) Notice(msg string) {
l.log.Output(3, msg)
}
-// variable to allow mocking the syslog.NewLogger call in the tests
-var newSyslog = newSyslogImpl
-
-func newSyslogImpl() (*log.Logger, error) {
- return syslog.NewLogger(SyslogPriority, SyslogFlags)
-}
-
-// NewConsoleLog creates a ConsoleLog with a log.Logger using the given
-// io.Writer and flag, and a syslog.Writer.
-func NewConsoleLog(w io.Writer, flag int) (*ConsoleLog, error) {
- clog := log.New(w, "", flag)
-
- sys, err := newSyslog()
- if err != nil {
- clog.Output(3, "WARNING: cannot create syslog logger")
- sys = log.New(ioutil.Discard, "", flag)
- }
-
- return &ConsoleLog{
- log: clog,
- sys: sys,
- }, nil
+// New creates a log.Logger using the given io.Writer and flag.
+func New(w io.Writer, flag int) (Logger, error) {
+ return Log{log: log.New(w, "", flag)}, nil
}
// SimpleSetup creates the default (console) logger
func SimpleSetup() error {
- l, err := NewConsoleLog(os.Stderr, DefaultFlags)
- if err != nil {
- return err
+ l, err := New(os.Stderr, DefaultFlags)
+ if err == nil {
+ SetLogger(l)
}
- SetLogger(l)
-
- return nil
+ return err
}
diff --git a/logger/logger_test.go b/logger/logger_test.go
index 2189442343..9996f04f62 100644
--- a/logger/logger_test.go
+++ b/logger/logger_test.go
@@ -17,18 +17,17 @@
*
*/
-package logger
+package logger_test
import (
"bytes"
- "fmt"
- "log"
"os"
"testing"
- "github.com/snapcore/snapd/testutil"
-
. "gopkg.in/check.v1"
+
+ "github.com/snapcore/snapd/logger"
+ "github.com/snapcore/snapd/testutil"
)
// Hook up check.v1 into the "go test" runner
@@ -37,116 +36,79 @@ func Test(t *testing.T) { TestingT(t) }
var _ = Suite(&LogSuite{})
type LogSuite struct {
- sysbuf *bytes.Buffer
+ oldLogger logger.Logger
}
func (s *LogSuite) SetUpTest(c *C) {
- c.Assert(logger, Equals, NullLogger)
-
- // we do not want to pollute syslog in our tests (and sbuild
- // will also not let us do that)
- newSyslog = func() (*log.Logger, error) {
- s.sysbuf = bytes.NewBuffer(nil)
- return log.New(s.sysbuf, "", SyslogFlags), nil
- }
+ s.oldLogger = logger.GetLogger()
+ logger.SetLogger(logger.NullLogger)
}
func (s *LogSuite) TearDownTest(c *C) {
- SetLogger(NullLogger)
- newSyslog = newSyslogImpl
+ logger.SetLogger(s.oldLogger)
}
func (s *LogSuite) TestDefault(c *C) {
- if logger != nil {
- SetLogger(nil)
+ if logger.GetLogger() != nil {
+ logger.SetLogger(nil)
}
- c.Check(logger, IsNil)
+ c.Check(logger.GetLogger(), IsNil)
- err := SimpleSetup()
+ err := logger.SimpleSetup()
c.Check(err, IsNil)
- c.Check(logger, NotNil)
- SetLogger(nil)
+ c.Check(logger.GetLogger(), NotNil)
}
func (s *LogSuite) TestNew(c *C) {
var buf bytes.Buffer
- l, err := NewConsoleLog(&buf, DefaultFlags)
+ l, err := logger.New(&buf, logger.DefaultFlags)
c.Assert(err, IsNil)
c.Assert(l, NotNil)
- c.Check(l.sys, NotNil)
- c.Check(l.log, NotNil)
}
func (s *LogSuite) TestDebugf(c *C) {
var logbuf bytes.Buffer
- l, err := NewConsoleLog(&logbuf, DefaultFlags)
+ l, err := logger.New(&logbuf, logger.DefaultFlags)
c.Assert(err, IsNil)
- SetLogger(l)
+ logger.SetLogger(l)
- Debugf("xyzzy")
- c.Check(s.sysbuf.String(), Matches, `(?m).*logger_test\.go:\d+: DEBUG: xyzzy`)
+ logger.Debugf("xyzzy")
c.Check(logbuf.String(), Equals, "")
}
func (s *LogSuite) TestDebugfEnv(c *C) {
var logbuf bytes.Buffer
- l, err := NewConsoleLog(&logbuf, DefaultFlags)
+ l, err := logger.New(&logbuf, logger.DefaultFlags)
c.Assert(err, IsNil)
- SetLogger(l)
+ logger.SetLogger(l)
os.Setenv("SNAPD_DEBUG", "1")
defer os.Unsetenv("SNAPD_DEBUG")
- Debugf("xyzzy")
- c.Check(s.sysbuf.String(), Matches, `(?m).*logger_test\.go:\d+: DEBUG: xyzzy`)
+ logger.Debugf("xyzzy")
c.Check(logbuf.String(), testutil.Contains, `DEBUG: xyzzy`)
}
func (s *LogSuite) TestNoticef(c *C) {
var logbuf bytes.Buffer
- l, err := NewConsoleLog(&logbuf, DefaultFlags)
+ l, err := logger.New(&logbuf, logger.DefaultFlags)
c.Assert(err, IsNil)
- SetLogger(l)
+ logger.SetLogger(l)
- Noticef("xyzzy")
- c.Check(s.sysbuf.String(), Matches, `(?m).*logger_test\.go:\d+: xyzzy`)
+ logger.Noticef("xyzzy")
c.Check(logbuf.String(), Matches, `(?m).*logger_test\.go:\d+: xyzzy`)
}
func (s *LogSuite) TestPanicf(c *C) {
var logbuf bytes.Buffer
- l, err := NewConsoleLog(&logbuf, DefaultFlags)
+ l, err := logger.New(&logbuf, logger.DefaultFlags)
c.Assert(err, IsNil)
- SetLogger(l)
+ logger.SetLogger(l)
- c.Check(func() { Panicf("xyzzy") }, Panics, "xyzzy")
- c.Check(s.sysbuf.String(), Matches, `(?m).*logger_test\.go:\d+: PANIC xyzzy`)
+ c.Check(func() { logger.Panicf("xyzzy") }, Panics, "xyzzy")
c.Check(logbuf.String(), Matches, `(?m).*logger_test\.go:\d+: PANIC xyzzy`)
}
-
-func (s *LogSuite) TestSyslogFails(c *C) {
- var logbuf bytes.Buffer
-
- // pretend syslog is not available (e.g. because of no /dev/log in
- // a chroot or something)
- newSyslog = func() (*log.Logger, error) {
- return nil, fmt.Errorf("nih nih")
- }
-
- // ensure a warning is displayed
- l, err := NewConsoleLog(&logbuf, DefaultFlags)
- c.Assert(err, IsNil)
- c.Check(logbuf.String(), Matches, `(?m).*:\d+: WARNING: cannot create syslog logger`)
-
- // ensure that even without a syslog the console log works and we
- // do not crash
- logbuf.Reset()
- SetLogger(l)
- Noticef("I do not want to crash")
- c.Check(logbuf.String(), Matches, `(?m).*logger_test\.go:\d+: I do not want to crash`)
-
-}