Skip to content

Commit

Permalink
feat(log): Adding support for multi grep
Browse files Browse the repository at this point in the history
Signed-off-by: Vincent Boutour <bob@vibioh.fr>
  • Loading branch information
ViBiOh committed May 6, 2024
1 parent 9ae4074 commit aaf9802
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 14 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Aliases:
Flags:
-c, --container string Filter container's name by regexp, default to all containers
-d, --dry-run Dry-run, print only pods
-g, --grep string Regexp to filter log
-g, --grep strings Regexp to filter log
--grepColor string Get logs only above given color (red > yellow > green)
-v, --invert-match Invert regexp filter matching
--levelKeys strings Keys for level in JSON (default [level,severity])
Expand Down
15 changes: 8 additions & 7 deletions cmd/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,10 @@ var (

jsonColorKeys []string

logFilter string
logFilters []string
invertGrep bool

logColorFilter *color.Color
logRegexp *regexp.Regexp
)

var logCmd = &cobra.Command{
Expand Down Expand Up @@ -91,12 +90,14 @@ var logCmd = &cobra.Command{
}
}

if len(logFilter) != 0 {
logRegexes := make([]*regexp.Regexp, len(logFilters))

for index, logFilter := range logFilters {
var err error

logRegexp, err = regexp.Compile(logFilter)
logRegexes[index], err = regexp.Compile(logFilter)
if err != nil {
return fmt.Errorf("log filter compile: %w", err)
return fmt.Errorf("compile log filter `%s`: %w", logFilter, err)
}
}

Expand All @@ -122,7 +123,7 @@ var logCmd = &cobra.Command{
WithDryRun(dryRun).
WithContainerRegexp(containerRegexp).
WithNoFollow(noFollow).
WithLogRegexp(logRegexp).
WithLogRegexes(logRegexes).
WithInvertRegexp(invertGrep).
WithColorFilter(logColorFilter).
WithJsonColorKeys(jsonColorKeys).
Expand All @@ -147,7 +148,7 @@ func initLog() {

flags.StringToStringVarP(&labelsSelector, "selector", "l", nil, "Labels to filter pods")

flags.StringVarP(&logFilter, "grep", "g", "", "Regexp to filter log")
flags.StringSliceVarP(&logFilters, "grep", "g", nil, "Regexp to filter log")
flags.BoolVarP(&invertGrep, "invert-match", "v", false, "Invert regexp filter matching")

flags.String("grepColor", "", "Get logs only above given color (red > yellow > green)")
Expand Down
27 changes: 21 additions & 6 deletions pkg/log/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ import (

type Logger struct {
selector map[string]string
logRegexes []*regexp.Regexp
containerRegexp *regexp.Regexp
logRegexp *regexp.Regexp
colorFilter *color.Color
resourceType string
resourceName string
Expand Down Expand Up @@ -61,8 +61,8 @@ func (l Logger) WithNoFollow(noFollow bool) Logger {
return l
}

func (l Logger) WithLogRegexp(logRegexp *regexp.Regexp) Logger {
l.logRegexp = logRegexp
func (l Logger) WithLogRegexes(logRegexes []*regexp.Regexp) Logger {
l.logRegexes = logRegexes

return l
}
Expand Down Expand Up @@ -222,16 +222,31 @@ func (l Logger) outputLog(reader io.Reader, outputter output.Outputter) {
continue
}

if l.logRegexp == nil {
if len(l.logRegexes) == 0 {
outputter.Std(Format(text, colorOutputter))

continue
}

if match := l.logRegexp.MatchString(text); (match && l.invertRegexp) || (!l.invertRegexp && !match) {
if match := l.matchRegexes(text); (match && l.invertRegexp) || (!l.invertRegexp && !match) {
continue
}

outputter.Std(FormatGrep(text, l.logRegexp, colorOutputter))
greppedText := text
for _, logRegexp := range l.logRegexes {
greppedText = FormatGrep(greppedText, logRegexp, colorOutputter)
}

outputter.Std(greppedText)
}
}

func (l Logger) matchRegexes(text string) bool {
for _, logRegexp := range l.logRegexes {
if !logRegexp.MatchString(text) {
return false
}
}

return true
}

0 comments on commit aaf9802

Please sign in to comment.