{"record":{"id":"a22dd92b347745ab","repo":"grpc/grpc-go","slug":"invalid-config-v","errorCode":null,"errorMessage":"invalid config: %v","messagePattern":"invalid config: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/binarylog/env_config.go","lineNumber":81,"sourceCode":"\t// \"\" is invalid.\n\tif config == \"\" {\n\t\treturn errors.New(\"empty string is not a valid method binary logging config\")\n\t}\n\n\t// \"-service/method\", blacklist, no * or {} allowed.\n\tif config[0] == '-' {\n\t\ts, m, suffix, err := parseMethodConfigAndSuffix(config[1:])\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid config: %q, %v\", config, err)\n\t\t}\n\t\tif m == \"*\" {\n\t\t\treturn fmt.Errorf(\"invalid config: %q, %v\", config, \"* not allowed in blacklist config\")\n\t\t}\n\t\tif suffix != \"\" {\n\t\t\treturn fmt.Errorf(\"invalid config: %q, %v\", config, \"header/message limit not allowed in blacklist config\")\n\t\t}\n\t\tif err := l.setBlacklist(s + \"/\" + m); err != nil {\n\t\t\treturn fmt.Errorf(\"invalid config: %v\", err)\n\t\t}\n\t\treturn nil\n\t}\n\n\t// \"*{h:256;m:256}\"\n\tif config[0] == '*' {\n\t\thdr, msg, err := parseHeaderMessageLengthConfig(config[1:])\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid config: %q, %v\", config, err)\n\t\t}\n\t\tif err := l.setDefaultMethodLogger(&MethodLoggerConfig{Header: hdr, Message: msg}); err != nil {\n\t\t\treturn fmt.Errorf(\"invalid config: %v\", err)\n\t\t}\n\t\treturn nil\n\t}\n\n\ts, m, suffix, err := parseMethodConfigAndSuffix(config)\n\tif err != nil {","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/grpc/grpc-go/blob/0c51461d27177d997e14c642fe18c11668fc09a3/internal/binarylog/env_config.go#L63-L99","documentation":"Returned by fillMethodLoggerWithConfigString when the internal setBlacklist call fails for a blacklist entry (env_config.go:80-81). This wraps the conflict errors from setBlacklist: either 'conflicting blacklist rules' (error 270, duplicate blacklist) or 'conflicting method rules' (error 271, method already has a logger). The %v is the underlying conflict error.","triggerScenarios":"A config string where a blacklist entry for a method conflicts with an existing entry. For example, '-Foo/Bar,Foo/Bar{m:256}' (method already logged) or '-Foo/Bar,-Foo/Bar' (duplicate blacklist). setBlacklist at binarylog.go:153-164 detects the conflict.","commonSituations":"Contradictory or duplicate entries for the same method in the filter string. Often results from composing config from multiple sources without deduplication.","solutions":["Inspect the wrapped error to determine if it is a duplicate blacklist or a method/logger conflict","Remove the conflicting entry so each method appears only once across blacklist and method rules","Deduplicate entries before composing the final filter string"],"exampleFix":"# before: blacklist conflicts with method logger\nexport GRPC_BINARY_LOG_FILTER=\"Foo/Bar{m:256},-Foo/Bar\"\n\n# after: only one rule per method\nexport GRPC_BINARY_LOG_FILTER=\"-Foo/Bar\"","handlingStrategy":"validation","validationCode":"// Combine all conflict checks for the binary log config string\nfunc validateBinaryLogConfig(s string) error {\n    if s == \"\" {\n        return nil\n    }\n    blacklist := map[string]bool{}\n    methods := map[string]bool{}\n    for _, part := range strings.Split(s, \",\") {\n        part = strings.TrimSpace(part)\n        if strings.HasPrefix(part, \"-\") {\n            entry := part[1:]\n            if brace := strings.Index(entry, \"{\"); brace >= 0 {\n                entry = entry[:brace]\n            }\n            if blacklist[entry] {\n                return fmt.Errorf(\"duplicate blacklist: %q\", entry)\n            }\n            if methods[entry] {\n                return fmt.Errorf(\"conflict: %q has both logging rule and blacklist\", entry)\n            }\n            blacklist[entry] = true\n        } else if !strings.HasPrefix(part, \"*\") {\n            if brace := strings.Index(part, \"{\"); brace >= 0 {\n                part = part[:brace]\n            }\n            if idx := strings.Index(part, \"/\"); idx >= 0 && part[idx+1:] != \"*\" {\n                if blacklist[part] {\n                    return fmt.Errorf(\"conflict: %q is blacklisted but has a logging rule\", part)\n                }\n                if methods[part] {\n                    return fmt.Errorf(\"duplicate method rule: %q\", part)\n                }\n                methods[part] = true\n            }\n        }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure each method appears in only one category: method logger OR blacklist, never both","Deduplicate all entries before composing the final filter string","Run a validation function on the config string before setting the environment variable"],"tags":["grpc","binarylog","config","environment-variables","logging"],"backgroundTag":null,"analyzedSha":"0c51461d27177d997e14c642fe18c11668fc09a3","analyzedAt":"2026-08-11T14:49:15.055Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}