aboutsummaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2018-04-18 21:02:01 +0100
committerGravatar GitHub <noreply@github.com> 2018-04-18 21:02:01 +0100
commitb4b65fbc188551d7fd6222026f57c0efb7d53855 (patch)
tree9e2322d2e577d137c406de319f65f9dff850db47 /plugin
parent51e1442bd97f6d51eccb5b18e36cfffd8e61bc1e (diff)
downloadcoredns-b4b65fbc188551d7fd6222026f57c0efb7d53855.tar.gz
coredns-b4b65fbc188551d7fd6222026f57c0efb7d53855.tar.zst
coredns-b4b65fbc188551d7fd6222026f57c0efb7d53855.zip
pkg/log: ability for debug logs (#1689)
* pkg/log: ability for debug logs When the debug plugin is enabled all log.Debug calls will print to standard; if not there are a noop (almost). The log package wraps some standard log functions as well, so just replacing "log" with "plugin/pkg/log" should be enough to use this package. * docs * Add docs * lint * Test fallthrough to log pkg as well * simple package - up test coverage * add other log levels as well * update docs
Diffstat (limited to 'plugin')
-rw-r--r--plugin/pkg/log/log.go69
-rw-r--r--plugin/pkg/log/log_test.go61
2 files changed, 130 insertions, 0 deletions
diff --git a/plugin/pkg/log/log.go b/plugin/pkg/log/log.go
new file mode 100644
index 000000000..6594f593d
--- /dev/null
+++ b/plugin/pkg/log/log.go
@@ -0,0 +1,69 @@
+// Package log implements a small wrapper around the std lib log package.
+// It implements log levels by prefixing the logs with [INFO], [DEBUG],
+// [WARNING] or [ERROR].
+// Debug logging is available and enabled if the *debug* plugin is used.
+//
+// log.Info("this is some logging"), will log on the Info level.
+//
+// log.Debug("this is debug output"), will log in the Debug level.
+package log
+
+import (
+ "fmt"
+ golog "log"
+)
+
+// D controls whether we should ouput debug logs. If true, we do.
+var D bool
+
+// logf calls log.Printf prefixed with level.
+func logf(level, format string, v ...interface{}) {
+ s := level + fmt.Sprintf(format, v...)
+ golog.Print(s)
+}
+
+// log calls log.Print prefixed with level.
+func log(level string, v ...interface{}) { s := level + fmt.Sprint(v...); golog.Print(s) }
+
+// Debug is equivalent to log.Print(), but prefixed with "[DEBUG] ". It only outputs something
+// if D is true.
+func Debug(v ...interface{}) {
+ if !D {
+ return
+ }
+ log(debug, v...)
+}
+
+// Debugf is equivalent to log.Printf(), but prefixed with "[DEBUG] ". It only outputs something
+// if D is true.
+func Debugf(format string, v ...interface{}) {
+ if !D {
+ return
+ }
+ logf(debug, format, v...)
+}
+
+// Info is equivalent to log.Print, but prefixed with "[INFO] ".
+func Info(v ...interface{}) { log(info, v...) }
+
+// Infof is equivalent to log.Printf, but prefixed with "[INFO] ".
+func Infof(format string, v ...interface{}) { logf(info, format, v...) }
+
+// Warning is equivalent to log.Print, but prefixed with "[WARNING] ".
+func Warning(v ...interface{}) { log(warning, v...) }
+
+// Warningf is equivalent to log.Printf, but prefixed with "[WARNING] ".
+func Warningf(format string, v ...interface{}) { logf(warning, format, v...) }
+
+// Error is equivalent to log.Print, but prefixed with "[ERROR] ".
+func Error(v ...interface{}) { log(err, v...) }
+
+// Errorf is equivalent to log.Printf, but prefixed with "[ERROR] ".
+func Errorf(format string, v ...interface{}) { logf(err, format, v...) }
+
+const (
+ debug = "[DEBUG] "
+ err = "[ERROR] "
+ warning = "[WARNING] "
+ info = "[INFO] "
+)
diff --git a/plugin/pkg/log/log_test.go b/plugin/pkg/log/log_test.go
new file mode 100644
index 000000000..c9ead7604
--- /dev/null
+++ b/plugin/pkg/log/log_test.go
@@ -0,0 +1,61 @@
+package log
+
+import (
+ "bytes"
+ golog "log"
+ "strings"
+ "testing"
+)
+
+func TestDebug(t *testing.T) {
+ var f bytes.Buffer
+ golog.SetOutput(&f)
+
+ // D == false
+ Debug("debug")
+ if x := f.String(); x != "" {
+ t.Errorf("Expected no debug logs, got %s", x)
+ }
+
+ D = true
+ Debug("debug")
+ if x := f.String(); !strings.Contains(x, debug+"debug") {
+ t.Errorf("Expected debug log to be %s, got %s", debug+"debug", x)
+ }
+}
+
+func TestDebugx(t *testing.T) {
+ var f bytes.Buffer
+ golog.SetOutput(&f)
+
+ D = true
+
+ Debugf("%s", "debug")
+ if x := f.String(); !strings.Contains(x, debug+"debug") {
+ t.Errorf("Expected debug log to be %s, got %s", debug+"debug", x)
+ }
+
+ Debug("debug")
+ if x := f.String(); !strings.Contains(x, debug+"debug") {
+ t.Errorf("Expected debug log to be %s, got %s", debug+"debug", x)
+ }
+}
+
+func TestLevels(t *testing.T) {
+ var f bytes.Buffer
+ const ts = "test"
+ golog.SetOutput(&f)
+
+ Info(ts)
+ if x := f.String(); !strings.Contains(x, info+ts) {
+ t.Errorf("Expected log to be %s, got %s", info+ts, x)
+ }
+ Warning(ts)
+ if x := f.String(); !strings.Contains(x, warning+ts) {
+ t.Errorf("Expected log to be %s, got %s", warning+ts, x)
+ }
+ Error(ts)
+ if x := f.String(); !strings.Contains(x, err+ts) {
+ t.Errorf("Expected log to be %s, got %s", err+ts, x)
+ }
+}