프로젝트

로그 분석 개발 - 이노베이션 아카데미 인턴십

장그래 2020. 8. 27. 23:34
반응형

1. 들어가며🤗

안녕하세요. 이노베이션 아카데미 인턴 장준영입니다. 제가 두 달 동안 맡은 프로젝트는 로그 분석기였습니다. 맡은 프로젝트에 관련된 내용과 로그에 대해 공부한 내용을 카뎃, 피시너, 이노베이션 아카데미의 관계자 분들께 공유하고 싶어 글을 작성합니다.
(글에 내용의 오류가 있거나 틀린 부분이 있다면 언제든지 지적해주세요 !)

2. 로그란?✍️

저는 얼마 전까지만해도 로그의 중요성에 대해 알지 못했습니다. 하지만 로그에 대해 알아가면 알아갈수록 이 녀석이 정말 중요하다는 것을 느끼게 되었습니다. 혼자만 중요한 사실을 느낄 수 없으니, 여러분도 한번 아래의 질문에 대해 생각해보면서 로그에 대한 중요성을 같이 느껴봅시다 !

Q1. 게임에서 수백 수천만의 아이템이 복사되어서 여러 유저들에게 들어갔다면 당신은 어떻게 그 아이템을 회수할 것인가요?

Q2. 웹에서 특정 집단에 디도스 공격을 받는다면 어떻게 아이피를 추적해서 차단할 것인가요?

Q3. 서비스 중인 프로그램이 새벽에 갑자기 장애가 난다면 여러분은 어떻게 그 사실을 알고 대처할 것인가요?

A1. 아이템의 로그를 바탕으로 아이템을 추적하고 회수한다. 또한 버그를 악용한 유저를 제재한다.

A2. Access 로그를 확인하고, 접속 IP를 확인하고 해당 지역 IP를 차단한다.

A3. 서비스에 에러가 발생하면 개발자에게 알림을 띄우고, 개발자는 로그를 바탕으로 장애를 해결한다.

이처럼 로그는 개발자에게 서비스 동작을 파악하게 해주고, 장애를 파악할 수 있게 해주는 유용하고 중요한 녀석입니다. 로그는 개발자 뿐만 아니라 기획/디자인/마케팅에서도 유용하게 사용됩니다. ( 다른 영역에서는 어떻게 사용되는지 알고 싶다면 링크를 참조하세요)

 

3. ELK🌐

어떻게 로그 분석기를 개발해야할지 방향성을 찾기 힘들어 IT 기업에서는 로그 분석을 어떻게 하는지에 대해 먼저 조사해봤습니다.
( ELK 셋팅부터 알람까지 - 우아한 형제들 , 내 서버에는 누가 들어오는 걸까? - Naver D2,  야생의 땅 듀랑고의 데이터 엔지니어링 을 참조했습니다)
기업에서 사용하는 로그 분석기를 먼저 조사한 이유는 아래와 같습니다.

 

1. 서비스를 하는 기업에서는 하루에 TB규모의 로그가 쌓일 것이다. (듀랑고라는 게임의 경우 3달 동안 110TB의 로그가 쌓였다고 합니다.)

2. 이러한 대용량 로그를 분석하기 위해선, 자체 개발한 프로그램보다는 현재 나와있는 툴이나 오픈소스를 사용할 것이다.

3. 시중에 나와있는 로그 분석 툴 및 오픈소스를 조사하자 !!

그 결과 기업에서는 중앙형 집중 로깅 방식을 통해 로그를 저장하며, elastic에서 제공하는 ELK(elastic stack)라는 것을 많이 사용한다는 사실을 알게되었습니다.
(ELK는 (elastic search + logstash + kibana)의 앞 글자를 딴 단어입니다.)

ELK에 대해 조사하고, 직접 설치해보며 조사한 결과를 바탕으로 세미나를 주최해여 인턴 친구들과 지식을 공유하는 시간을 가졌습니다.
이를 통해서 로그 분석기를 어떻게 개발해야 될지에 대한 방향성을 어느 정도 잡게 되었습니다.
(발표 자료가 궁금하시면 링크를 참조해주세요 !)

 

로그 수집 ELK 세미나 - 개인 블로그라서 다른 분들의 얼굴을 잘랐습니다.

4. 직접 만들어본 로그 분석기👨🏻‍💻

사실 로그 분석기를 개발해서 쓰는 것 보다, 분석하고자 하는 서버에 파이프라인만 연결한다면 분석, 시각화까지 알아서 해주는 ELK를 사용하는 것이 훨씬 간단하고 편리합니다.
하지만 ELK를 쓰지 않고 로그 분석기를 개발하고자 하는 이유는 공부 및 개발 실력 향상을 시키기 위해서입니다.

저는 로그 분석기의 역할을 수집-분석-시각화와 같이 3단계로 나눴습니다. 또한 짧은 시간동안 개발해야 하기 때문에 수집 부분을 과감히 빼버리고 분석-시각화 개발에 집중하기로 했습니다.

 

4.1 분석

수집 단계를 생략하고 분석을 진행했기 때문에 더미 데이터가 필요했습니다. 더미 데이터로는
아파치 웹 로그 파일과 nodejs winston 로그 파일을 사용했습니다.
로그를 파싱할 수 있는 방법은 총 3가지라고 생각했고 그 중 정규 표현식 방법을 선택하게 되었습니다.

정규 표현식 코드

 

1. string 메서드로 특정 문자열을 기준으로 문자열을 자른다.
→ 코드 가독성이 떨어짐, 로그 format이 달라지면 로직을 다시 짜야함
→ 아래 로그 캡쳐 모두 web access log이지만 약간의 format이 다름 (자르기가 힘듬)

2. loop를 통해 원하는 데이터를 파싱한다.
→ 코드 가독성이 떨어짐
→ 원하는 데이터를 추출하고 싶으면 로직을 다시 짜야함

3. 정규 표현식을 통해 원하는 데이터를 파싱한다.
→ 코드 가독성이 좋음
→ 정규 표현식을 제대로 작성한다면 어떤 로그도 파싱할 수 있음 (제대로 작성하지 않으면 성능 문제가 발생함)
→ 새로운 데이터를 추출하고 싶다면 정규 표현식 한 줄만 추가하면 됨

apache access log

 

nodejs winston log

 

위와 같은 로그를 정규 표현식으로 파싱하게 되면 아래와 같은 결과를 얻게 됩니다. 보기 힘들었던 로그 데이터가 보기 쉽게 바뀐 것을 볼 수 있습니다.

정규표현식을 통해 파싱된 로그들

 

이렇게 파싱된 데이터를 이제 시각화 하는 일만 남았습니다 !

4.2 시각화

시각화의 목적은 원하는 데이터를 한눈에 보게 하기 위함입니다. 그렇기 때문에 먼저 어떤 데이터를 보여줄 것인가? 에 대한 고민을 먼저해야했습니다.

1. 어떤 IP가 가장 많이 접속을 했는가 ?

2. 어떤 페이지를 가장 많이 방문 했는가?

3. 어떤 경로를 통해 사이트에 많이 접속을 했는가?

3가지 데이터 이외에도 시간 대별 사용자와 같은 시간을 이용한 데이터도 추출할 수 있었지만, 시간을 분석한다면 예상 개발 시간 보다 긴 시간을 잡아먹을 것 같다는 생각이 들어 제외하였습니다.
위와 같은 데이터를 추출하기 위해선 내림차순으로 데이터를 정렬하여 카운팅 해줬습니다.

내림차순으로 정렬된 데이터

 

이러한 정렬된 데이터를 시각화 해주는 도구는 정말 많습니다. 저는 아래와 같은 조건의 시각화 툴을 찾아보게 되었습니다.

1. javacript 기반의 시각화 툴이 있었으면 좋겠다.

2. 개발 기간이 짧은 만큼, 별 다른 코딩이 없었으면 좋겠다.

3. 화려하고 멋진 시각화 보다는 이해하기 쉽고 명확하게 결과가 표현 되었으면 좋겠다.

amchartd3.js를 사용하자 !!

위와 같은 조건을 바탕으로 d3.js와 amchart를 사용하기로 결정하였습니다.
사용 방법은 공식 문서를 참조하였으며, d3.js로 JSON 파일을 읽고, 데이터를 amchart로 출력 하는 방식을 이용했습니다.

시각화 결과물

 

완성 !!
전체 코드는 https://github.com/open-inno/2020intern_loganalysis 에서 보실 수 있습니다.
(궁금한 부분은 issue 또는 junyeong.dev@gmail.com 으로 연락주세요 !)

5. 마치며🙋

길다면 길고, 짧다면 짧은 2달의 인턴 기간이 종료되었습니다. ELK 부터 시작해서 로그분석기 개발까지 진행보니 정말 뿌듯하고 의미있는 시간이었습니다. 또한 저는 이제 학교로 돌아가서 다시 공부를 열심히 하면서 개발자의 꿈을 향해 계속 달려가려고 합니다.


끝으로 프로젝트에 도움을 주신 동료 인턴분들, 멘토님들에게 정말 감사하다는 말을 글을 통해 다시 한번 남깁니다 (__)

반응형

'프로젝트' 카테고리의 다른 글

2019 한이음 ICT 멘토링 후기  (0) 2021.04.08
중국산업시찰단 - 중국 기업 방문 part1  (0) 2020.09.30