본문 바로가기

카테고리 없음

[Elastic Stack]Logstash 에서 json 필터 적용

애플리케이션 로그 관리를 위해 Elastic Stack 을 적용해보려고 시도 중.

예전에 사전 학습 거의 없이 톰캣 로그로 기능 맛보기 해볼 때는 몰랐는데 막상 실제 로그 이용해보려 하니 막막해져서 우선 Elastic Stack 관련 책으로 기본 학습부터 도전. 그런데 Elastic Search 책들이 대부분이고 Kibana 나 Logstash 다룬 책들은 거의 눈에 띄지 않네요.

몇 권의 Elastic Search 책들 골라 클러스터, 노드 관리 등은 건너 뛰고 인덱스, 매핑, 검색 기능 등만 빠르게 훑어본다고 봤는데 그러고 나니 머릿 속이 더 하얗게 되는 느낌.

책 덮고 적용 도전.

  • Kibana 에서 인덱스 관리하는 부분, Dev Tools, Discover 사용법 등 간단히 학습.
  • Logstash 필터 설정 중 grok 사용법 학습.

이 중에서 오늘은 Logstash 필터 설정 삽질했던거 정리해볼게요.

애플리케이션별로 로그 파일 별도 생성하고 있고 각기 그 패턴이 달라 우선 그 중 로그 제일 많이 쌓인 녀석 하나 골랐는데 그 로그 파일의 기본 형식이 다음과 같습니다.

2019-11-12 17:02:12 [INFO ] [OPS_TRACKING] - {"msgType":"TRACKING","msgJson":"{\"mchnId\":\"T768\",\"mchnTp\":\"YT\",\"position\":{\"che\":{\"x\":305091.0985956704,\"y\":2769188.676740436,\"direction\":null,\"degree\":null,\"speed\":30.0},\"spreader\":null,\"boom\":null},\"location\":null}"}

https://grokconstructor.appspot.com/do/match 을 이용해서 문법 오류 우선 확인하고, Logstash 설정 파일의 오류는 '--config.test_and_exit' 옵션을 이용해서 확인. 

사용 예 : bin\logstash.bat -f config\ee-log.yml --config.test_and_exit

인덱스된 결과 데이터까지 간단하게 확인하는 방법 있을 듯 한데 아직까지는 못 찾아서 인덱스 삭제하고 Logstash 재기동하고를 수십차례 반복하는 중.

  • 첫번째 시도
filter {
    grok {
        match => { "message" => '%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:loglevel} \] \[%{WORD:logcat}\] - {"msgType":"%{WORD:msgtype}*","msgJson":"{\\"mchnId\\":\\"%{WORD:mchnid}\\",\\"mchnTp\\":\\"(%{WORD:mchntp}|%{SPACE:mchntp})\\",%{GREEDYDATA:msgjson}}"}' }
    }
}

그런데로 결과 나오기는 하는데 json 형태의 값을 이렇게 무식하게 파싱해야할까 고민 시작.

  • 두번째 시도
filter {
    grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:loglevel} \] \[%{WORD:logcat}\] - %{GREEDYDATA:jsonstring}" }
    }
    json {
        source => "jsonstring"
        target => "doc"
    }
}

json 필터 제공된다는 것 알고 적용해 봄. 한결 깔끔하게 처리되었다. 하지만 json 내부의 값 형태로 들어가 있는 json (msgJson 부분)은 여전히 일반 텍스트로 처리되고 있음.

  • 세번째 시도
filter { 
    grok { 
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:loglevel}\s?
\] \[%{WORD:logcat}\] - %{GREEDYDATA:jsonstring}" } 
    } 
    json { 
        source => "jsonstring" 
        target => "doc" 
    } 
    json { 
        source => "[doc][msgJson]" 
        target => "doc1" 
    } 

json 필터 반복 사용도 가능하다는 설명 보고 json 필터를 중복 적용해 보았다. 처음에는 첫번째 json 필터에서 적용된 결과값을 보고 아래와 같이 시도했는데 json 파싱 에러 발생.

source => "doc.msgJson" 

어림짐작으로 몇가지 뻘짓 더하다가 다시 검색 시도해서 사용 형식 찾았다.

source => "[doc][msgJson]" 

드디어 거의 원하는 수준에 가깝게 결과 나옴.

첫 걸음 떼는 것 쉽지 않았지만 그래도 한 걸음 디뎠다.

이제 자동 매핑 되지 않도록 해야 하는데 아마 Logstash 에 매핑 템플릿 적용하는 식으로 하는 듯.공부할게 참 많다.