2018년 4월 8일 일요일

Logstash 필터 dissect

로그 분석을 데이터 분석 수준까지 끌어올리려면 원시로그 덩어리를 필드별 고유성이 명확히 구분되는 테이블 구조로 바꿔야 하는데, 이때 grok 필터의 역할은 독보적이다.

영역별로 윈도우 웹로그를 분리 저장하는 정규표현식
grok 필터에 사용된 정규표현식
grok 필터에 의한 필드 분류 결과

엘라스틱한 문자열 처리를 자랑하는 grok 필터의 단점은 일단 어렵(고 성능dl 저하될 수도 있)다는 것. 그래서 사전 정의된 grok 패턴 사용은 별로 권하지 않는다. 아무래도 범용성을 높이려다 그랬겠지만 너무 복잡한 정규표현식을 사용하기 때문.

grok 필터를 사용할 때 성능 저하를 막으려면, 분석 대상 로그에 최적화된 정규표현식을 직접 작성하는 것이 최선이다. 물론 성능 저하를 막는 가장 좋은 방법은 정규표현식을 안 쓰는 것이고(..)

정규표현식을 안 쓸 수 있나?

dissect 필터가 대안이 될 수 있다.


dissect는 '%{필드이름}구분자%{필드이름}' 형식의 구문을 사용하며, 구분자는 분석 대상 데이터의 구조에서 임의 선택할 수 있다. 다음은 윈도우 웹로그의 유일한 구분자인 공백을 이용한 dissect 필터식 구문.
dissect {
 mapping => { "message" => "%{timestamp} %{+timestamp} %{} %{} %{method} %{url} %{var} %{} - %{clientip} %{agent} %{status} %{}" }
}

해당 필터에 의한 필드 분류 결과는 다음과 같다. grok 사용 결과와 동일.


'%{timestamp} %{+timestamp}' 구문에서 '+'는 공백을 기준으로 두번째 매핑된 문자열을 'timestamp' 필드에 추가하라는 의미의 수정자(modifier).

결과적으로 '2011-01-12 15:42:36' 문자열이 '날짜'와 '시간' 단위로 분리되지 않고, 하나의 필드에 담을 수 있도록 해준다. '%{}'처럼 이름이 없는 구문은 별도 필드로 저장하지 않겠다는 의미.

dissect 필터는 정규표현식을 사용하지 않고도 매우 효과적인 필드 분류 기능을 보여준다. 전체 데이터에 일관된 구분자가 적용되어 있다면.

url에서 추출해야 하는 '파일명'처럼 구분자가 일정하지 않다면 grok만큼 효과를 기대할 수 없다는 얘기. 결국 적절한 구분자를 찾아서 dissect로 뭉텅뭉텅 자른 후, grok으로 다듬는 식의 혼용이 해법이 되지 않을까 싶다.

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스