| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // 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), "logonce: ", 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{}),
- }
- }
|