logonce is a package that prints each distinct message only once
This commit is contained in:
parent
3682c537a4
commit
7caf3b32eb
|
@ -0,0 +1,47 @@
|
||||||
|
// 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{}),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue