package binarylog
import (
)
func ( string) Logger {
if == "" {
return nil
}
:= newEmptyLogger()
:= strings.Split(, ",")
for , := range {
if := .fillMethodLoggerWithConfigString(); != nil {
grpclogLogger.Warningf("failed to parse binary log config: %v", )
return nil
}
}
return
}
func ( *logger) ( string) error {
if == "" {
return errors.New("empty string is not a valid method binary logging config")
}
if [0] == '-' {
, , , := parseMethodConfigAndSuffix([1:])
if != nil {
return fmt.Errorf("invalid config: %q, %v", , )
}
if == "*" {
return fmt.Errorf("invalid config: %q, %v", , "* not allowed in blacklist config")
}
if != "" {
return fmt.Errorf("invalid config: %q, %v", , "header/message limit not allowed in blacklist config")
}
if := .setBlacklist( + "/" + ); != nil {
return fmt.Errorf("invalid config: %v", )
}
return nil
}
if [0] == '*' {
, , := parseHeaderMessageLengthConfig([1:])
if != nil {
return fmt.Errorf("invalid config: %q, %v", , )
}
if := .setDefaultMethodLogger(&MethodLoggerConfig{Header: , Message: }); != nil {
return fmt.Errorf("invalid config: %v", )
}
return nil
}
, , , := parseMethodConfigAndSuffix()
if != nil {
return fmt.Errorf("invalid config: %q, %v", , )
}
, , := parseHeaderMessageLengthConfig()
if != nil {
return fmt.Errorf("invalid header/message length config: %q, %v", , )
}
if == "*" {
if := .setServiceMethodLogger(, &MethodLoggerConfig{Header: , Message: }); != nil {
return fmt.Errorf("invalid config: %v", )
}
} else {
if := .setMethodMethodLogger(+"/"+, &MethodLoggerConfig{Header: , Message: }); != nil {
return fmt.Errorf("invalid config: %v", )
}
}
return nil
}
const (
maxUInt = ^uint64(0)
longMethodConfigRegexpStr = `^([\w./]+)/((?:\w+)|[*])(.+)?$`
optionalLengthRegexpStr = `(?::(\d+))?`
headerConfigRegexpStr = `^{h` + optionalLengthRegexpStr + `}$`
messageConfigRegexpStr = `^{m` + optionalLengthRegexpStr + `}$`
headerMessageConfigRegexpStr = `^{h` + optionalLengthRegexpStr + `;m` + optionalLengthRegexpStr + `}$`
)
var (
longMethodConfigRegexp = regexp.MustCompile(longMethodConfigRegexpStr)
headerConfigRegexp = regexp.MustCompile(headerConfigRegexpStr)
messageConfigRegexp = regexp.MustCompile(messageConfigRegexpStr)
headerMessageConfigRegexp = regexp.MustCompile(headerMessageConfigRegexpStr)
)
func ( string) (, , string, error) {
:= longMethodConfigRegexp.FindStringSubmatch()
if == nil {
return "", "", "", fmt.Errorf("%q contains invalid substring", )
}
= [1]
= [2]
= [3]
return
}
func ( string) (, uint64, error) {
if == "" {
return maxUInt, maxUInt, nil
}
if := headerConfigRegexp.FindStringSubmatch(); != nil {
if := [1]; != "" {
, = strconv.ParseUint(, 10, 64)
if != nil {
return 0, 0, fmt.Errorf("failed to convert %q to uint", )
}
return , 0, nil
}
return maxUInt, 0, nil
}
if := messageConfigRegexp.FindStringSubmatch(); != nil {
if := [1]; != "" {
, = strconv.ParseUint(, 10, 64)
if != nil {
return 0, 0, fmt.Errorf("failed to convert %q to uint", )
}
return 0, , nil
}
return 0, maxUInt, nil
}
if := headerMessageConfigRegexp.FindStringSubmatch(); != nil {
= maxUInt
= maxUInt
if := [1]; != "" {
, = strconv.ParseUint(, 10, 64)
if != nil {
return 0, 0, fmt.Errorf("failed to convert %q to uint", )
}
}
if := [2]; != "" {
, = strconv.ParseUint(, 10, 64)
if != nil {
return 0, 0, fmt.Errorf("failed to convert %q to uint", )
}
}
return , , nil
}
return 0, 0, fmt.Errorf("%q contains invalid substring", )
}