2016년 3월 2일 수요일

LogParser 활용(Web Log 이상징후 분석)

2016년도 벌써 1/6이 지났네. 작심삼일을 앞으로 백번 정도만 더 하면 올해도 다 가겠지? 잡설은 그만(..) 개인적으로 10여 년 이상 로그 분석 업무를 해오면서 느낀 점이 하나 있다면 바로 내가 나름 운이 좋은 놈이라는 거. VIM, 엑셀과 함께 LogParser를 알게 됐으니까.

이 분석도구 3총사를 알지 못했다면 진작에 다른 일 알아보지 않았을까? 일전에도 잠깐 소개했지만 LogParser는 정말 많은 일을 할 수 있다. 그래서 일 많이 하고 싶은(?) 사람들을 위해 LogParser 활용 사례를 소개해볼까 한다. 첫 번째는 Windows 웹서버 로그 분석 사례.

하루에 8만 줄이 넘어가는 로그

LogParser는 데이터베이스 언어, 즉 SQL을 이용해서 대상 데이터를 분석하기 때문에 분석 대상 데이터의 필드 구성을 파악할 필요가 있다. Windows 웹로그의 필드 구성은 다음과 같다.

구글 블로그는 왜 표 그리기가 없는겨?

참고로 웹로그 필드 구성은 '관리도구 > IIS 관리자 > 로깅 > 필드 선택' 메뉴를 이용해서 수정이 가능하다.


이제 해당 웹로그의 이상징후를 분석해보자. 뭘 분석해야 할까? 해킹 코드? 북한 IP? 이상징후 분석은 말 그대로 '이상한' 상태를 찾는 것. 그리고 이상한 상태를 찾는 가장 쉬운 방법은 시간대별로 발생한 상태의 개수를 세는 것.

주식 거래량의 이상징후

어떤 상태의 개수를 세면 될까? 시간대별로 발생한 출발지, 포트, URL 등, 시간대별로 발생한 모든 상태에서 정상과 비정상 구분의 힌트를 찾을 수 있지만, 그중에서도 웹서버의 동작 현황을 보여주는 웹 응답코드는 웹로그 이상징후 분석을 얘기할 때 빠지지 않고 등장하는 단골 메뉴.

주요 웹 응답코드

특히 404와 500 응답코드는 사용자의 요청에 대해 각각 페이지를 찾을 수 없거나, 내부 처리에 실패했을 때 웹서버가 사용자에게 전송하는 에러 메시지로, 없는 페이지를 요청한 또는 정상 처리가 어려운 요청을 한 '이상한' 사용자라는 관점에서 분석할 가치가 있다. 다음 그림은 LogParser Studio를 이용해서 404 응답코드의 발생 현황을 조회한 화면이며, 사용한 쿼리문은 다음과 같다.

select to_string(time, 'hh:mm:ss'), count(*)
from d:\ex.log
where sc-status = 404
group by to_string(time, 'hh:mm:ss')


LogParser Studio의 차트 생성 기능(단축키 F6)으로 확인한 결과, 16 ~17시 사이에 404 응답코드의 증가가 확인되었다.


500 응답코드의 발생 현황도 확인해보자. ③번 SQL 구문을 'where sc-status = 500'으로 바꾸면 된다. 500 응답코드는 15시경부터 증가하고 있다.


따로 보니 별 감흥이 없는 듯하다. 합쳐보자. 시간대별 전체 웹 응답코드 발생 현황을 조회하는 쿼리문은 다음과 같다.

select to_string(time, 'hh:mm:ss'), sc-status, count(*)
 from d:\ex.log
③ group by to_string(time, 'hh:mm:ss'), sc-status


LogParser는 차트로 표현해야 하는 값을 가진 필드가 둘 이상일 경우에는 차트 생성을 지원하지 않는다. 엑셀의 피벗 기능을 이용하자. 전체 응답코드의 시간대별 발생 현항을 차트로 변환한 결과는 다음과 같다. 피벗 차트에서 400, 500 응답코드의 발생 추이만을 선택, 조회해보면 서로의 증가 시점이 겹친다는 사실을 알 수 있다.


더 극적인 그림을 원한다면 시간대 범위를 좁혀서 데이터 발생 분포의 밀도를 높여보자. 최대 86,400개의 스케일을 갖는 초 단위 시간대를 1,440개의 분 단위로 줄이면 엑셀도 덜 버벅거린다. 쿼리문의 시간 단위를 초 단위에서 분 단위로 바꾼 결과는 다음과 같다.

① select to_string(time, 'hh:mm'), sc-status, count(*)
 from d:\ex.log
③ group by to_string(time, 'hh:mm'), sc-status


한눈에 봐도 이상해 보인다. 이제  해당 응답코드의 발생 원인 및 발생 주체 등 세부적인 분석 단계로 넘어가야 한다. 갈 길이 멀다.^^;

to be continued..

댓글 없음:

댓글 쓰기

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