lib/logger: Split STTRACE into list of strings (#9402)

Currently `IsTraced("xyz")` will return true for
any inclusion of "xyz" in string.

This change splits `STTRACE` using `','`, `' '` and `';'`
as delimiters. That makes facilities separation
more clear.
This commit is contained in:
gudvinr 2024-02-06 16:07:59 +03:00 committed by GitHub
parent f2f5786b33
commit 9f6d732587
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -15,6 +15,8 @@ import (
"strings" "strings"
"sync" "sync"
"time" "time"
"golang.org/x/exp/slices"
) )
// This package uses stdlib sync as it may be used to debug syncthing/lib/sync // This package uses stdlib sync as it may be used to debug syncthing/lib/sync
@ -63,7 +65,7 @@ type logger struct {
handlers [NumLevels][]MessageHandler handlers [NumLevels][]MessageHandler
facilities map[string]string // facility name => description facilities map[string]string // facility name => description
debug map[string]struct{} // only facility names with debugging enabled debug map[string]struct{} // only facility names with debugging enabled
traces string traces []string
mut sync.Mutex mut sync.Mutex
} }
@ -80,9 +82,21 @@ func New() Logger {
} }
func newLogger(w io.Writer) Logger { func newLogger(w io.Writer) Logger {
traces := strings.FieldsFunc(os.Getenv("STTRACE"), func(r rune) bool {
return strings.ContainsRune(",; ", r)
})
if len(traces) > 0 {
if slices.Contains(traces, "all") {
traces = []string{"all"}
} else {
slices.Sort(traces)
}
}
return &logger{ return &logger{
logger: log.New(w, "", DefaultFlags), logger: log.New(w, "", DefaultFlags),
traces: os.Getenv("STTRACE"), traces: traces,
facilities: make(map[string]string), facilities: make(map[string]string),
debug: make(map[string]struct{}), debug: make(map[string]struct{}),
} }
@ -217,7 +231,16 @@ func (l *logger) SetDebug(facility string, enabled bool) {
// IsTraced returns whether the facility name is contained in STTRACE. // IsTraced returns whether the facility name is contained in STTRACE.
func (l *logger) IsTraced(facility string) bool { func (l *logger) IsTraced(facility string) bool {
return strings.Contains(l.traces, facility) || l.traces == "all" if len(l.traces) > 0 {
if l.traces[0] == "all" {
return true
}
_, found := slices.BinarySearch(l.traces, facility)
return found
}
return false
} }
// FacilityDebugging returns the set of facilities that have debugging // FacilityDebugging returns the set of facilities that have debugging