WzDat과 Pandas를 통한 로그 데이터 분석

46
“데이터, 데이터, 데이터” 참지 못하고 그는 외쳤다. “흙도 없이 벽돌을 만들 수는 없잖아!” - 셜록 홈즈, 너도밤나무집

description

WzDat로 로그 파일을 선택, 가공하고 Pandas로 고급분석을!

Transcript of WzDat과 Pandas를 통한 로그 데이터 분석

Page 1: WzDat과 Pandas를 통한 로그 데이터 분석

“데이터,����������� ������������������  데이터,����������� ������������������  데이터”����������� ������������������  참지����������� ������������������  못하고����������� ������������������  그는����������� ������������������  외쳤다.����������� ������������������  

“흙도����������� ������������������  없이����������� ������������������  벽돌을����������� ������������������  만들����������� ������������������  수는����������� ������������������  없잖아!”����������� ������������������  ����������� ������������������  

- 셜록 홈즈, 너도밤나무집 中

Page 2: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat과 Pandas를 통한 로그 데이터 분석

Page 3: WzDat과 Pandas를 통한 로그 데이터 분석

과학의 패러다임 변천- from Jim Gray on eScience

• 수 천년 전 - 경험에 의해

• 수 백년 전 - 이론에 의해

• 수 십년 전 - 계산에 의해

• 현재 - 데이터 탐사에 의해

Page 4: WzDat과 Pandas를 통한 로그 데이터 분석

데이터 탐사의 단계!

1. 데이터를 수집

2. 데이터를 선별

3. 정보의 형태로 저장

4. 전문가가 분석

Page 5: WzDat과 Pandas를 통한 로그 데이터 분석

빅 데이터?• 하둡

• ~TB 단위의 분석에 적합

• 셋팅 및 MR코딩의 비용

• GB 단위는 다양한 방법이 가능

• SQL, NoSQL, 스크립트 등

• 저비용, Try & Discover에 유리

Page 6: WzDat과 Pandas를 통한 로그 데이터 분석

로그 (= 데이터?)

Page 7: WzDat과 Pandas를 통한 로그 데이터 분석

로그의 장점

• 개발자라면 누구나 사용

• NoSQL 원조 - 추가, 수정에 용이.

• 파일은 생각보다 안정적

• 문제 발생 후 사후 분석에 최적

• 장기간 보존이 필요 없다 - “Big Stream”

Page 8: WzDat과 Pandas를 통한 로그 데이터 분석

로그의 단점

• 여러개의 머신, 파일로 흩어져 있다.

• 하나의 타임 라인으로 보기 힘들다.

• 정규화 되어있지 않다.

Page 9: WzDat과 Pandas를 통한 로그 데이터 분석

로그가 데이터가 되려면

• 흩어져 있는 로그 파일들 -> 수집

• 서로 다른 파일 들 -> 하나의 타임라인으로 통합

• 정규화 되지 않은 로그 메시지들 -> 선별 및 정규화

Page 10: WzDat과 Pandas를 통한 로그 데이터 분석

바람직한 로그• 로그 파일 생성시 파일(경로)명에 필요한 정보

• 로그가 발생한 일시

• 로그를 생성한 서버의 종류

• 로그를 생성한 서버의 번호

• 로그 파일 내용에 필요한 할 정보

• 로그 메시지를 출력한 일시 (년:월:일 - 시:분:초)

• 로그 메시지의 레벨 (크리티컬, 에러, 워닝, 정보, 디버그)

• 로그가 수집될 때 파일(경로)에 필요한 할 정보

• 로그를 생성한 노드(머신) 이름 - 지역 정보 포함 권장

Page 11: WzDat과 Pandas를 통한 로그 데이터 분석

• 좋은 로그 파일명

C:/APPNAME-KR/GS101/AgentServer_2013-01-28.log

• 부족한 로그 파일명

C:/log.txt

Page 12: WzDat과 Pandas를 통한 로그 데이터 분석

• 좋은 로그 메시지

2013/06/28-13:07:59 [ERR] - File Open Error

2013/06/28-13:08:00 [WRN] - Player Log Out

!

• 부족한 로그 메시지

6/28 File Open Error

Player Log Out

Page 13: WzDat과 Pandas를 통한 로그 데이터 분석

로그 수집

Page 14: WzDat과 Pandas를 통한 로그 데이터 분석

로그 수집

• 분산되어 있는 로그를 한 곳으로 모으는 과정

• 기존 프로젝트 로그 수집

• 서비스 중인(파일기반) 로그 집중화의 목적

• 새로운 프로젝트 로그 수집

• 최신 솔루션 선택이 가능

Page 15: WzDat과 Pandas를 통한 로그 데이터 분석

Apps

Log

Apps

Log

Node

Apps

Log

Apps

Log

Node

Apps

Log

Apps

Log

Node

Log Node

Log Log

rsync

rsync

rsync

Page 16: WzDat과 Pandas를 통한 로그 데이터 분석

로그 선별, 저장 - WzDat“What’s That?”

Page 17: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat• 로그에서 의미 있는 데이터를 쿼리

• 단순하지만 강력한 파이썬 구문 형식

• 다량의 비 정규화된 로그 파일을 선별 후,

• 보거나

• 변환하거나 (-> Pandas 구조체)

• 저장(다운로드)

Page 18: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat

Page 19: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 셀렉터

뒤에 ~s가 붙은 복수형 단어, 각괄호 [ ] 로 조건 기술

• files - 파일 선택

• nodes - 노드(머신) 선택

• servers - 서버(앱) 선택

• dates - 일시(Date Time) 선택

Page 20: WzDat과 Pandas를 통한 로그 데이터 분석

files• 모든 파일을 선택

files

• 첫 번째, 마지막 파일

files[0], files[-1]

• 100번째 에서 10개 파일

files[100:110]

• 앞에서 10개, 뒤에서 10개

files[:10], files[-10:]

Page 21: WzDat과 Pandas를 통한 로그 데이터 분석

dates• 파일이 있는 모든 일시를 선택

dates

• 파일이 있는 첫 번째, 마지막 일시

dates[0], dates[-1]

• 같은 식으로

dates[100:110], dates[:10], date[-10:]

Page 22: WzDat과 Pandas를 통한 로그 데이터 분석

nodes• 파일을 만든 모든 노드(머신)를 선택

nodes

• 파일을 만든 첫 번째, 마지막 노드

nodes[0], nodes[-1]

• 같은 식으로

nodes[100:110], nodes[:10], nodes[-10:]

Page 23: WzDat과 Pandas를 통한 로그 데이터 분석

servers• 파일을 만든 모든 서버(앱)을 선택

servers

• 파일을 만든 첫 번째, 마지막 서버

servers[0], servers[-1]

• 같은 식으로

servers[100:110], servers[:10], servers[-10:]

Page 24: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 상수• ‘카테고리 . 이름’의 형식

• 파일 분석과정에서 자동으로 정의

• 상수의 카테고리는 공통, 이름은 프로젝트 별로 다양하다. (아래는 C9의 예)

• node.ASIA_1 # 아시아 1번 서버 머신

• server.GameServer # 게임서버

• date.D2013_07_11 # 2013년 7월 11일

Page 25: WzDat과 Pandas를 통한 로그 데이터 분석

상수로 필터링• 2013년 7월 11일 파일만

files[date.D2013_07_11]

• 게임 서버 파일만

files[server.GameServer]

• ASIA-1 노드에서 파일이 발생한 일시만

dates[node.ASIA_1]

Page 26: WzDat과 Pandas를 통한 로그 데이터 분석

상수 매칭

• 상수의 앞 문자열만 맞으면 모두 매칭

# node.ASIA_1, node.ASIA_2, … 식으로 여럿 있을 때

files[node.ASIA] # 모든 아시아 노드의 파일이 매칭

Page 27: WzDat과 Pandas를 통한 로그 데이터 분석

셀렉터의 결과로 필터링• 마지막 날의 파일만 선택

files[dates[-1]]

• 마지막 날 파일을 만든 노드만 선택

nodes[dates[-1]]

• 아시아 지역의 마지막 날 파일만 선택

files[dates[node.ASIA][-1]]

Page 28: WzDat과 Pandas를 통한 로그 데이터 분석

복합 조건 필터링

• 마지막 날의 게임서버 파일만

files[dates[-1], server.GameServer]

• 7월 12일의 게임/인증 서버 파일중 마지막 10개만

files[date.D2013_07_12, server.GameServer, server.AuthServer][-10:]

Page 29: WzDat과 Pandas를 통한 로그 데이터 분석

파일 병합, 단어 검색• 조건에 맞는 파일들을 합쳐 하나의 임시파일에 저장

files[…].merge()

• 파일들에서 ‘ERR’단어를 포함한 줄만 찾아 임시파일에 저장

files[…].find(‘ERR’)

• 검색 결과 내 재검색

files[…].find(‘ERR’).find(‘OnClose’)

Page 30: WzDat과 Pandas를 통한 로그 데이터 분석

결과 보기

• 선택 결과 파일 앞, 뒤 보기

files[…].head(), files(…).tail()

files[…][:-10], files[…].[-10:]

• 파일 내용 앞, 뒤 보기

files[…].merge().head(), files(…).find(‘ERR”).tail()

files[…].merge()[0:10], files(…).find(‘ERR”).[-10:]

Page 31: WzDat과 Pandas를 통한 로그 데이터 분석

DataFrame으로 변환!

• 병합,찾은 결과를 Pandas의 DataFrame으로 변환

files[…].find(…).to_frame()

• find, merge는 여러 파일을 합쳐주지만, 아직 타임 라인 소팅은 되지 않은 상태

• DataFrame으로 만들어 질 때 비로소 시간 순서대로 정렬된다.

Page 32: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 어댑터와 파일타입• 프로젝트 별로 다르다

• 파일 경로명, 파일 종류, 내용 기록 방식등

• 공용 인터페이스를 위한 프로젝트 어댑터 작성 필요

• 하나 이상의 파일 타입 모듈을 작성

• c9.log - C9의 로그 파일 모듈 (*.txt)

• c9.dump - C9 덤프 파일 모듈 (*.dmp)

Page 33: WzDat과 Pandas를 통한 로그 데이터 분석

덤프 파일의 경우하나 이상의 파일타입이 있으면 각각 다른 이름으로 임포트

예) import log as l, import dump as d

• 최근 덤프가 발생한 일시

d.dates[-1]

• 최근 덤프가 발생한 서버 (d는 dump 모듈)

d.servers[d.files[-1]]

Page 34: WzDat과 Pandas를 통한 로그 데이터 분석

이종 파일간 셀렉트

• 서로 다른 종류의 파일을 참고하여 셀렉트

• 예) 덤프 파일(d)로 로그 파일(l) 선택

# 마지막 덤프의 노드, 서버, 일시에 일치하는 # 로그 파일만 선택

l.files[d.files[-1]]

Page 35: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 로그 저장

• 파일 다운로드 링크 출력

files[…].link

• 압축된 파일 다운로드 링크 출력

files[…].zlink

Page 36: WzDat과 Pandas를 통한 로그 데이터 분석

시연

Page 37: WzDat과 Pandas를 통한 로그 데이터 분석

로그 분석 - Pandas

Page 38: WzDat과 Pandas를 통한 로그 데이터 분석

Pandas

• 사용이 편리한 파이썬 데이터 분석 툴

• 다양한 데이터 조작 방식 - R에서 영감을 받음

• 대량의 데이터를 고속으로 처리 (C/C++, MMF)

• 높은 수준의 분석을 위해 꼭 필요

• numpy, matplotlib 사용

Page 39: WzDat과 Pandas를 통한 로그 데이터 분석
Page 40: WzDat과 Pandas를 통한 로그 데이터 분석

Series

• 인덱스를 가지는 배열같은 구조체 !In [3]: s = Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']) !In [4]: s Out[4]: a 1 b 2 c 3 d 4 dtype: int64

Page 41: WzDat과 Pandas를 통한 로그 데이터 분석

DataFrame

• 인덱스와 컬럼을 가지는 구조체

• 엑셀의 테이블과 유사 !In [1]: d = DataFrame(np.random.randn(3, 4), index=['one', 'two', 'three'], columns=['a', 'b', 'c', 'd']) !In [2]: d Out[2]: a b c d one -0.513031 -0.687210 -0.433650 0.483474 two 0.233899 -0.000048 0.637124 1.004753 three 0.803571 -1.093059 0.450721 0.044777

Page 42: WzDat과 Pandas를 통한 로그 데이터 분석

열 선택, 평균 구하기• 열의 이름으로 선택 !In [7]: d['a'] Out[7]: one -0.008556 two 0.669164 three -1.033598 Name: a, dtype: float64

• (열 기준) 평균 구하기 !In [4]: d.mean() Out[4]: a 0.174813 b -0.593439 c 0.218065 d 0.511002 dtype: float64

Page 43: WzDat과 Pandas를 통한 로그 데이터 분석

그래프 그리기• 내부적으로 matplotlib을 사용

• 구조체 인스턴스의 plot메소드 !In [3]: d.plot() Out[3]: <matplotlib.axes.AxesSubplot at 0x105c99dd0>

Page 44: WzDat과 Pandas를 통한 로그 데이터 분석

시연

• 서버별 로그 크기 그래프

• 용량이 많은 에러 종류 Top 10

• ‘Long time Dispatch’ 경고 시간별 평균 그래프

Page 45: WzDat과 Pandas를 통한 로그 데이터 분석

Q&A감사합니다.

Page 46: WzDat과 Pandas를 통한 로그 데이터 분석

참고 링크• Pandas - pandas.pydata.org

• 10 Minutes to Pandas - pandas.pydata.org/pandas-docs/dev/10min.html

• IPython - ipython.org

• Don’t use Hadoop - your data isn’t that big - www.chrisstucchio.com/blog/2013/hadoop_hatred.html

• 파이썬 라이브러리를 활용한 데이터 분석 - www.yes24.com/24/goods/11043328?scode=032&OzSrank=1