if 조건에서 일치하는 Logstash 정규식

if 조건에서 일치하는 Logstash 정규식

Logstash 필터링에서는 다양한 오류 조건을 기반으로 여러 레이블을 설정했으며 모든 레이블에는 "abc:"와 같은 접두사가 있습니다.

출력에서 태그에 "abc:*"가 있는지 여부에 따라 이메일을 보내고 싶습니다.

나는 문서를 읽을 때 이것을 발견하지 못했습니다.

대부분은 다음과 같이 작성됩니다.

[태그]에 "abc"가 있는 경우 { ... ... }

하지만 조건이 "abc-*"가 포함된 태그와 일치하기를 원합니다. 어떤 아이디어가 있나요?

답변1

이것을 찾고 계십니까(여기서 Perl 구문)?

s/if\s*\"([^\"]*)\"\s*in\s*\[tags\].*/$1:/g;

abc가 단어인 경우 \w대신 사용할 수 있습니다 [^\"].

답변2

@sudobash 좋아요, 이전 의견을 업데이트하세요. 이것은 해결책이 아니라 문제입니다. 이 질문을 받은 지 오랜 시간이 지났다는 것을 알고 있지만 나중에 필요한 사람이 있을 경우를 대비해 해결책은 다음과 같습니다.


"태그" 필드 위로 마우스를 가져가면 해당 필드가 "문자열" 필드라는 것을 알 수 있습니다.아니요이것이 실제로 사실입니다. 공식에 따르면 다음을 통해 확인할 수 있습니다.Elasticsearch 문서, 필터링 시 다음 조건을 사용할 수 있습니다.

equality: ==, !=, <, >, <=, >=
regexp: =~, !~ (checks a pattern on the right against a string value on the left)
inclusion: in, not in

주의를 기울이면 문자열 비교에 "regexp"를 사용할 수 있어야 하는데 "태그"에서는 작동하지 않는 이유는 무엇입니까? 대답은 "태그"가 문자열 필드가 아니기 때문입니다."배열" 필드/객체입니다.따라서 모든 비교는 배열의 특정 위치를 가리켜야 합니다.

예를 들어 Logstash 파이프라인에서 이 필터를 사용하는 경우:

filter {
  if [tags][0] =~ /foo.*/ {
     mutate { add_tag => "worked" }
  }
}

예상대로 작동합니다. 위 예에서 "tags"의 위치 [0]이 정규식 조건 "foo.*"와 일치하면 새 값("worked")이 태그 배열에 추가됩니다.

이제 실생활에서는 비교하려는 레이블이 배열의 어디에 있는지 알 수 없기 때문에 이것이 유용하지 않을 것이라는 점을 이해합니다. 그렇죠? 그래서 상자에서 바로 꺼내면,불가능한이를 달성하려면 루비 필터를 사용해야 합니다. 인용하다이 게시물.

다음은 이전 필터 예제에서 수행한 작업을 정확하게 수행하는 기본 루비 필터입니다.하지만이번에는 동적으로 실행됩니다.

filter {
  ruby {
    code => '
        mbool = 0
        event.get("tags").each_index { |x|
          if event.get("tags")[x] =~ /foo.*/
            mbool = 1
          end
        }
        if mbool == 1
          event.tag("ruby-worked")
        end
    '
}

물론 궁극적으로 달성하려는 목표에 따라 다르지만 이 기사가 도움이 될 것이라고 확신합니다.

관련 정보