| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package log
- import (
- "io"
- "log"
- "os"
- "sync"
- g "github.com/anacrolix/generics"
- )
- type nameToAny struct {
- emptyCase bool
- children map[string]*nameToAny
- }
- var reportedNames reportedNamesType
- type reportedNamesType struct {
- mu sync.Mutex
- base nameToAny
- }
- func putReportInner(toAny *nameToAny, names []string) bool {
- if len(names) == 0 {
- if toAny.emptyCase {
- return false
- }
- toAny.emptyCase = true
- return true
- }
- g.MakeMapIfNil(&toAny.children)
- child, ok := toAny.children[names[0]]
- if !ok {
- child = new(nameToAny)
- toAny.children[names[0]] = child
- }
- return putReportInner(child, names[1:])
- }
- // Prevent duplicate logs about the same series of names.
- func (me *reportedNamesType) putReport(names []string) bool {
- me.mu.Lock()
- defer me.mu.Unlock()
- return putReportInner(&me.base, names)
- }
- var reportRulesLogger = log.New(os.Stderr, "anacrolix/log: ", 0)
- func init() {
- if os.Getenv(EnvReportRules) == "" {
- reportRulesLogger.SetOutput(io.Discard)
- }
- }
- func reportLevelFromRules(level Level, ok bool, names []string) {
- if !reportedNames.putReport(names) {
- return
- }
- if !ok {
- reportRulesLogger.Printf("no rule matched for %q", names)
- return
- }
- reportRulesLogger.Printf("got level %v for %q", level.LogString(), names)
- }
|