하나의 상태가 하나의 의미만을 가질 수 있도록 필드를 정규화해준 grok 필터가 일 다 했다는 얘기. 필터링 과정을 살펴보자. 다음은 전체 로그 중 'timestamp'와 'method' 및 URL 경로인 'w_path' 정보를 추출해주는 정규표현식.
이때 'w_path' 정보를 추출하는 정규표현식 '\S*\/'에서 최소 0개를 검사할 수 있는 수량자 '*'를 사용한 이유는 경로가 루트 디렉토리(/)만으로 끝날 수도 있기 때문이다.
다음은 최소 하나 이상을 검사하는 수량자 '+'를 사용한 결과. 경로가 루트 디렉토리(/)만으로 끝날 경우 검사에 실패한다는 사실을 알 수 있다.
다음은 필드 추출 범위에 'file' 정보를 추가한 정규표현식.
이때 정규표현식 '\S*'에서 수량자 '*'를 사용한 이유 역시, 검사 범위를 0개까지 확장함으로써, 다음 그림처럼 'file' 정보가 없을 때 검사에 실패하지 않기 위해서이다.
다음은 필드 추출 범위에 URL 변수 영역 'var' 정보를 추가한 정규표현식. 윈도우 IIS 웹로그는 특이하게 500 에러 발생 시 메시지를 변수 영역에 함께 표시한다. 당연히 변수와 에러 메시지를 분리하는게 정확한 분석에 유리.
에러 메시지는 '|' 기호를 이용해서 변수와 구분되기 때문에, '변수공백' 문자열과 '변수|에러공백' 문자열이 발생하는 경우 모두를 검사하도록 정규표현식 '\S+'를 '\S+(\s|\|.+\s)'로 수정했다.
regexper.com |
그런데 다음 그림을 보면 에러 메시지 분리가 안 되고 있다. 수량자는 기본적으로 욕심쟁이이기 때문에 '\S'가 '\s'를 만날 때까지 최대 범위를 검사하고 있는 것.
검사 범위를 최소로 제한하도록 정규표현식 '\S+'를 '\S+?'로 수정. 이제 변수와 에러 메시지가 분리된다.
정규표현식을 사용하다 보면 자꾸 욕심이 생긴다. 에러 코드를 제외한 메시지만을 추출할 수는 없을까? 다음은 정규표현식 '\S+?(\s|\|.+\s)'를 '\S+?(\s|(\|.+\|)(\S+)\s)'로 수정한 결과.
에러 코드만을 검사하는 별도의 표현식을 추가함으로써 코드 번호와 메시지를 별도로 검사하게 한 것.
regexper.com |
나머지는 쉽다. 다음은 최종 완성된 정규표현식.
regex101.com |
전체 분석 과정에서 정규표현식 작성하는 데 쓴 시간이 얼마나 될까? grok 필터가 일 다 한 이유가 있다.
관련 글
댓글 없음:
댓글 쓰기