Content Table

cm-toc v.0.4 By 코마

웹 로그 분석 Part 1

Pandas 와 WSL 을 이용한 빠른 분석

24 Jun 2019 by 코마 (gbkim1988@gmail.com)

안녕하세요 코마입니다. 오늘은 윈도우 환경에서 대량의 IIS 로그를 효율적으로 분석하는 방법을 소개해 드리겠습니다. 😺

개요

그 동안 IIS 로그 분석에 로그파서(Logparser)를 이용해 오신 분들이라면 로그 분석에 걸리시는 시간이 상당한 점을 들어 그 불편함을 체감하였을 것입니다.

이번에 소개드릴 내용은 WSL, Pandas 를 이용하여 빠르게 원하는 키워드를 검색하고 추출한 데이터에서 가독성이 높은 자료를 산출하는 방법입니다.

목표

이번 시간 목표는 아래와 같습니다.

효과

리눅스 명령어와 파이프라인을 통해 수백 기가의 로그를 1 시간 이내에 검색하고 원하는 칼럼을 추출하여 데이터 분석을 진행합니다. (로그를 정제 후 분석하므로 조회 시간이 수 분이내로 단축됩니다.)

WSL 이란

WSL 이란 Windows Subsystem for Linux 의 줄임말입니다. 즉, 윈도우에서 bash 쉘을 사용함을 말합니다.

bash 쉘의 장점은 파이프라인(pipeline)을 이용하여 여러 파일들을 빠르게 처리할 수 있음을 의미합니다.

즉, awk, grep, sort, uniq 등의 명령어 조합만으로 원하는 로그를 단 시간내에 추출하는 과정을 의미합니다.

과거에는 윈도우 배치를 이용해야 했으므로 성능적인 면이나 파이프라이닝이 어려웠습니다. 그러나 Windows 10 부터는 WSL 을 이용하여 이러한 특징을 최대한 활용할 수 있으므로 기존의 로그 추출 시간을 수 시간 이내로 당겨줍니다.

명령어 목록

IIS 로그는 공백을 구분자(delimiter)로 사용하므로 awk 를 이용하여 쉽게 파싱이 가능합니다.

그러나 여러 서버의 파일을 동시에 작업할 경우 로그 필드 설정이 다를 수 있습니다. 이 경우는 나중에 알아보도록 하겠습니다.

관심 키워드 설정

로그를 분석하는 목적을 명확히 해야합니다. 로그에서 특정 키워드를 설정하고 이를 통해 다양한 분석이 가능합니다.

일반적으로 아래 세가지 항목으로 접근하게 되는데요.

위의 질문들에 답을 하기 위해 로그를 분석하게 됩니다. 그렇다면 분석 단계를 살펴볼까요?

키워드 설정

1.1.1.1 의 가상의 아이피가 있다고 가정합니다. 이 아이피를 통해서 접속한 URI 목록을 확인하여 해당 사용자가 정상 사용자인지를 식별해 본다고 합니다. 정상 여부를 확인하는 방법은 각 URI 에 접속한 빈도가 일반 사용자 보다 높은 경우입니다.

1.1.1.1 로그 추출

우리는 이미 대상을 알고 있으므로 grep 명령어를 통해 전체 데이터에서 로그를 필터해줍니다.

cat */*.log | grep '1.1.1.1' > 1.1.1.1_IIS_Logs_yymmdd.log

정상적으로 로그 추출이 완료되었는지는 아래의 명령어를 통해서 확인할 수 있습니다. 여기서 nl 명령어는 출력 시 각 행에 대한 줄 번호를 추가하는 기능입니다.

awk 를 처음 접하는 경우 for 문을 보고 놀라실 수 있습니다. 그러나 통상적으로 사용하는 패턴이라고 생각하면 됩니다. 이해할 필요도 암기할 필요도 없습니다. Just Copy & Paste 가 답입니다.

head -n1 ./1.1.1.1_IIS_Logs_yymmdd.log | awk '{ for(i=1;i<=NF;++i) print $i}' | nl

awk 가 쪼개 놓은 필드의 번호를 확인하였습니다. 이제 각 필드를 출력하여 서버들의 로그 설정이 동일한지를 체크해 봅니다.

URI 필드의 번호가 11이라고 가정해봅니다.

cat ./1.1.1.1_IIS_Logs_yymmdd.log | awk '{ print $11 }' | sed -e 's/[[:space:]]*//' | sort - | uniq -c

위의 명령어를 입력하게되면 아래와 같이 나옵니다. 아래의 표는 다음과 같이 해석할 수 있습니다.

# output 
100 /hello/world
10 /welcome
5 /uniq_id

쿠키 추출

추출한 아이피가 접속한 URI 를 확인하였습니다. 이제 쿠키 정보를 통해서 얼마나 다양한 유저가 접속하였는지를 정확히 파싱해 보도록 하겠습니다. 이때 사용하는 명령어는 grep 입니다.

grep 의 옵션 중에서 매칭된 패턴만을 가져오도록 -oP 옵션을 사용하도록 하겠습니다.

cat ./1.1.1.1_IIS_Logs_yymmdd.log | grep -oP "\+UsernameCookieInfo=\K(\S*)" | awk -F\; '{ print $1 }' | sed -e 's/[[:space:]]*//' | sort - | uniq -d

만약에 쿠키 정보의 필드 이름이 다를 경우에 UsernameCookieInfo 텍스트를 원하는 텍스트로 변경해 줍니다.

\K (역슬래시-대문자-케이) 는 펄(Perl)의 정규식 엔진에 match 작업을 \K가 선언된 지점부터 하라고 선언하는 효과를 가집니다. 즉, A=\K(.*) 의 의미는 A=ABCDFDFD 문자열에서 ABCDFDFD 만을 매칭하라는 의미가 됩니다.

grep -oP 이후의 awk 파이프라인은 쿠키 구분자 ; 를 이용해서 원하는 부분을 자르는 과정이며 공백 처리 후(sed) 중복을 제거하여 출력합니다.

아래의 사이트에서 편하게 옵션 정보를 확인토록 하세요. 😺

아래의 출력 결과가 보이시나요 여러분의 사이트에 접속한 사용자를 로그 분석만을 통해서 아래와 같이 추출할 수 있습니다. uniq -c 명령을 마지막에 사용한다면 각 사용자의 이름이 로그상에서 출현한 횟수를 구할 수 있습니다.

이를 통해 사용자의 활동 빈도를 다른 사용자와 비교할 수 있습니다.

# Output
user01
user02
user03
user04
.... 
(중략)

마무리

지금까지 윈도우 상의 리눅스 쉘을 이용하여 IIS 로그를 추출하고 간단히 통계를 내는 작업을 같이 진행해 보았습니다. 그러나 이는 추출 단계에 불과합니다. 다음 시간 (Part-2) 에서는 Pandas 를 이용하여 추출한 데이터를 바탕으로 분석을 진행하도록 하겠으며 시간 여유가 된다면 자동화 개발까지 알려 드리고자 합니다.

여러분이 심플하면서도 멋진 분석 결과 보고서를 제출하는 그날까지 저 코마는 최선을 다하도록 하겠습니다.

구독해주셔서 감사합니다. 더욱 좋은 내용으로 찾아뵙도록 하겠습니다. 감사합니다

링크 정리

이번 시간에 참조한 링크는 아래와 같습니다. 잘 정리하셔서 필요할 때 사용하시길 바랍니다.

이 작가의 다음 글 감상