“데이터,
 데이터,
 데이터”
 참지
 못하고
 그는
 외쳤다.
 
“흙도
 없이
 벽돌을
 만들
 수는
 없잖아!”
 
 
- 셜록 홈즈, 너도밤나무집 中
WzDat과 Pandas를 통
한 로그 데이터 분석
과학의 패러다임 변천
- from Jim Gray on eScience
•

수 천년 전 - 경험에 의해

•

수 백년 전 - 이론에 의해

•

수 십년 전 - 계산에 의해

•

현재 - 데이터 탐사에 의해
데이터 탐사의 단계
!

1. 데이터를 수집
2. 데이터를 선별
3. 정보의 형태로 저장
4. 전문가가 분석
빅 데이터?
•

하둡
•
•

•

~TB 단위의 분석에 적합
셋팅 및 MR코딩의 비용

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

SQL, NoSQL, 스크립트 등

•

저비용, Try  Discover에 유리
로그 (= 데이터?)
로그의 장점
•

개발자라면 누구나 사용

•

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

•

파일은 생각보다 안정적

•

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

•

장기간 보존이 필요 없다 - “Big Stream”
로그의 단점
•

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

•

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

•

정규화 되어있지 않다.
로그가 데이터가 되려면
•

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

•

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

•

정규화 되지 않은 로그 메시지들 - 선별 및 정규화
바람직한 로그
•

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

로그를 생성한 서버의 종류

•
•

로그가 발생한 일시

로그를 생성한 서버의 번호

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

•

로그 메시지를 출력한 일시 (년:월:일 - 시:분:초)
로그 메시지의 레벨 (크리티컬, 에러, 워닝, 정보, 디버그)

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

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

좋은 로그 파일명
C:/APPNAME-KR/GS101/AgentServer_2013-01-28.log

•

부족한 로그 파일명
C:/log.txt
•

좋은 로그 메시지

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
로그 수집
로그 수집
•

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

•

기존 프로젝트 로그 수집
•

•

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

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

최신 솔루션 선택이 가능
Node
Apps
Log

Apps
Log

rsync
Log Node

Node
Apps
Log

Apps

rsync

Log

Log

Node
Apps
Log

Apps
Log

rsync

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

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

•

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

•

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

보거나

•

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

•

저장(다운로드)
WzDat
WzDat 셀렉터
뒤에 ~s가 붙은 복수형 단어, 각괄호 [ ] 로 조건 기술
•

files - 파일 선택

•

nodes - 노드(머신) 선택

•

servers - 서버(앱) 선택

•

dates - 일시(Date Time) 선택
files
•

모든 파일을 선택
files

•

첫 번째, 마지막 파일
files[0], files[-1]

•

100번째 에서 10개 파일
files[100:110]

•

앞에서 10개, 뒤에서 10개
files[:10], files[-10:]
dates
•

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

•

파일이 있는 첫 번째, 마지막 일시
dates[0], dates[-1]

•

같은 식으로
dates[100:110], dates[:10], date[-10:]
nodes
•

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

•

파일을 만든 첫 번째, 마지막 노드
nodes[0], nodes[-1]

•

같은 식으로
nodes[100:110], nodes[:10], nodes[-10:]
servers
•

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

•

파일을 만든 첫 번째, 마지막 서버
servers[0], servers[-1]

•

같은 식으로
servers[100:110], servers[:10], servers[-10:]
WzDat 상수
•

‘카테고리 . 이름’의 형식

•

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

•

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

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

•

server.GameServer # 게임서버

•

date.D2013_07_11 # 2013년 7월 11일
상수로 필터링
•

2013년 7월 11일 파일만
files[date.D2013_07_11]

•

게임 서버 파일만
files[server.GameServer]

•

ASIA-1 노드에서 파일이 발생한 일시만
dates[node.ASIA_1]
상수 매칭
•

상수의 앞 문자열만 맞으면 모두 매칭
# node.ASIA_1, node.ASIA_2, … 식으로 여럿 있을 때
files[node.ASIA] # 모든 아시아 노드의 파일이 매칭
셀렉터의 결과로 필터링
•

마지막 날의 파일만 선택
files[dates[-1]]

•

마지막 날 파일을 만든 노드만 선택
nodes[dates[-1]]

•

아시아 지역의 마지막 날 파일만 선택
files[dates[node.ASIA][-1]]
복합 조건 필터링
•

마지막 날의 게임서버 파일만
files[dates[-1], server.GameServer]

•

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

files[date.D2013_07_12, server.GameServer,
server.AuthServer][-10:]
파일 병합, 단어 검색
•

조건에 맞는 파일들을 합쳐 하나의 임시파일에 저장
files[…].merge()

•

파일들에서 ‘ERR’단어를 포함한 줄만 찾아 임시파일에 저장
files[…].find(‘ERR’)

•

검색 결과 내 재검색
files[…].find(‘ERR’).find(‘OnClose’)
결과 보기
•

선택 결과 파일 앞, 뒤 보기

files[…].head(), files(…).tail()
files[…][:-10], files[…].[-10:]
•

파일 내용 앞, 뒤 보기

files[…].merge().head(), files(…).find(‘ERR”).tail()
files[…].merge()[0:10], files(…).find(‘ERR”).[-10:]
DataFrame으로 변환
!

•

병합,찾은 결과를 Pandas의 DataFrame으로 변환
files[…].find(…).to_frame()

•

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

•

DataFrame으로 만들어 질 때 비로소 시간 순서대로
정렬된다.
WzDat 어댑터와 파일타입
•

프로젝트 별로 다르다
•

•

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

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

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

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

•

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

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