Adapt format.go from the image package Change the only package level state variable to a function parameter Load entire files into memory for performance
45 lines
902 B
Go
45 lines
902 B
Go
package lsgo
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/go-kit/kit/log"
|
|
)
|
|
|
|
var Logger log.Logger = log.NewNopLogger()
|
|
|
|
// NewFilter allows filtering of l
|
|
func NewFilter(f map[string][]string, l log.Logger) log.Logger {
|
|
return filter{
|
|
filter: f,
|
|
next: l,
|
|
}
|
|
}
|
|
|
|
type filter struct {
|
|
next log.Logger
|
|
filter map[string][]string
|
|
}
|
|
|
|
func (f filter) Log(keyvals ...interface{}) error {
|
|
allowed := true // allow everything
|
|
for i := 0; i < len(keyvals)-1; i += 2 {
|
|
if v, ok := keyvals[i].(string); ok { // key
|
|
if fil, ok := f.filter[v]; ok { // key has a filter
|
|
if v, ok = keyvals[i+1].(string); ok { // value is a string
|
|
allowed = false // this key has a filter deny everything except what the filter allows
|
|
for _, fi := range fil {
|
|
if strings.Contains(v, fi) {
|
|
allowed = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if allowed {
|
|
return f.next.Log(keyvals...)
|
|
}
|
|
return nil
|
|
}
|