reporting-rules.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package log
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. )
  7. var rules []Rule
  8. type Rule func(names []string) (level Level, matched bool)
  9. func alwaysLevel(level Level) Rule {
  10. return func(names []string) (Level, bool) {
  11. return level, true
  12. }
  13. }
  14. func stringSliceContains(s string, ss []string) bool {
  15. for _, sss := range ss {
  16. if strings.Contains(sss, s) {
  17. return true
  18. }
  19. }
  20. return false
  21. }
  22. func containsAllNames(all []string, level Level) Rule {
  23. return func(names []string) (_ Level, matched bool) {
  24. for _, s := range all {
  25. //log.Println(s, all, names)
  26. if !stringSliceContains(s, names) {
  27. return
  28. }
  29. }
  30. return level, true
  31. }
  32. }
  33. func parseRuleString(s string) (_ Rule, ok bool, _ error) {
  34. if s == "" {
  35. return
  36. }
  37. ss := strings.SplitN(s, "=", 2)
  38. level := NotSet
  39. var names []string
  40. if ss[0] != "*" {
  41. names = strings.Split(ss[0], "+")
  42. }
  43. if len(ss) > 1 {
  44. var ok bool
  45. var err error
  46. level, ok, err = levelFromString(ss[1])
  47. if !ok {
  48. // blah= means disable the name, but just blah means to always include it
  49. level = disabled
  50. }
  51. if err != nil {
  52. return nil, false, fmt.Errorf("parsing level %q: %w", ss[1], err)
  53. }
  54. }
  55. return containsAllNames(names, level), true, nil
  56. }
  57. func parseEnvRules() (rules []Rule, err error) {
  58. rulesStr := os.Getenv(EnvRules)
  59. ruleStrs := strings.Split(rulesStr, ",")
  60. for _, ruleStr := range ruleStrs {
  61. rule, ok, err := parseRuleString(ruleStr)
  62. if err != nil {
  63. return nil, fmt.Errorf("parsing rule %q: %w", ruleStr, err)
  64. }
  65. if !ok {
  66. continue
  67. }
  68. rules = append(rules, rule)
  69. }
  70. return
  71. }
  72. func levelFromString(s string) (level Level, ok bool, err error) {
  73. if s == "" {
  74. return
  75. }
  76. ok = true
  77. err = level.UnmarshalText([]byte(s))
  78. return
  79. }
  80. func levelFromRules(names []string) (level Level, ok bool) {
  81. defer func() {
  82. reportLevelFromRules(level, ok, names)
  83. }()
  84. // Later rules take precedence, so work backwards
  85. for i := len(rules) - 1; i >= 0; i-- {
  86. r := rules[i]
  87. level, ok = r(names)
  88. if ok {
  89. return
  90. }
  91. }
  92. return
  93. }