--- /dev/null
+// Package logonce implements an io.Writer facade that only performs distinct
+// writes. This can be used by log.Loggers as they're guaranteed to make a
+// single Write method call for each message. This is useful for loggers that
+// print useful information about unexpected conditions that aren't fatal in
+// code.
+package logonce
+
+import (
+ "io"
+ "log"
+ "os"
+)
+
+// A default logger similar to the default logger in the log package.
+var Stderr *log.Logger
+
+func init() {
+ // This should emulate the default logger in the log package where
+ // possible. No time flag so that messages don't differ by time. Code
+ // debug information is useful.
+ Stderr = log.New(Writer(os.Stderr), "", log.Lshortfile)
+}
+
+type writer struct {
+ w io.Writer
+ writes map[string]struct{}
+}
+
+func (w writer) Write(p []byte) (n int, err error) {
+ s := string(p)
+ if _, ok := w.writes[s]; ok {
+ return
+ }
+ n, err = w.w.Write(p)
+ if n != len(s) {
+ s = string(p[:n])
+ }
+ w.writes[s] = struct{}{}
+ return
+}
+
+func Writer(w io.Writer) io.Writer {
+ return writer{
+ w: w,
+ writes: make(map[string]struct{}),
+ }
+}