본문 바로가기
Data/ELK

[2021.04.01] 인턴 +31 log Analysis 2 (로그 분석 2)

by injekim97 2021. 4. 1.
반응형

[2021.04.01] 인턴 +31  log Analysis 2 (로그 분석 2)

 

 

우선 시작하기 앞서, 내가 공부해야 할 것들을 정리해보겠다.

1. log analysis ( 로그 분석 - 거의 끝나감)

2. 친절한 AI(끝까지 보기 - 이번 주 할 예정)

3. kaggle -> 월마트 -> AWS SageMarker (youtube 참고해서 공부) 

------------------------------------------------------------------------------

 

자, 이제 다른 web log 파일을 가지고 실습하기 전에, 로그 분석 1(게시글)에 썼던 꿀팁들을 기억하자

 

 로그 분석을 하면서 꼭 기억할 점 

1. 컴퓨터 사양이 부족해서 (위의 로그 55000 line -> 1000 line으로 바꿈)

2. 명령 프롬프트 보단, powershell이 더 빨리 출력되는 거 같음(느낌상)

3. filter에서 remove_field는 grok 안에 쓰는 것이 아니라, grok 밖에서 remove_field 해야 함.(이거 때문에 시간 좀 잡아먹음)

 

 

 꿀팁  

-> 해당 logstash -f 파일명. conf(logstash기동) 후에, log파일(메모장)로 켜서 log를 1개(한 문장)씩 지워가면서 하면 결괏값이 바로 뜬다. 이유는 모른다.(그냥 해라, 기다리다가 속 뒤집어진다)

------------------------------------------------------------------------------------------------

 

 

 

www.kaggle.com/shawon10/web-log-dataset

 

web log dataset

Online Judge ( RUET OJ) Server Log Dataset

www.kaggle.com

-> 이번 실습에서 제공해주는 web log dataset이다.

-> 당연히 해당 파일의 저작권은 위의 게시글 작성자에게 있다.

 

 

weblog.csv
1.06MB
weblog.log
1.06MB

 

 

----------------------------------------------------------------------------------------------------

자, 이제 log pattens를 분석해보자.

 

예시) 실습할 log형태 (아파치 로그 형태가 아님. 그냥 단순한 log 형태 이기 때문에 grok으로 하나하나 구별해줘야 함)

-> 10.131.2.1,[29/Nov/2017:06:59:04,GET /js/vendor/moment.min.js HTTP/1.1,200

 

 

1. 로그분석
1-1) grok-patterns에서 일치하는 패턴을 찾아서 사용

github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

 

1-2) 또는 grok debugger를 이용해서 패턴을 분석

http://grokdebug.herokuapp.com/

2. grok 문법
%{SYNTAX:SEMANTIC}

 

* SYNTAX

->log text에 매치되는 패턴의 이름이다.

 

 

 


3. 예제

ex1) IP 데이터인 경우

%{IP: client}


즉 데이터 형태(IP): 데이터 이름(client)으로 명시
IP 형태의 데이터가 오면 client필드에 저장

 

ex2) 기간 데이터인 경우는

%{NUMBER:duration}


즉 데이터 형태(NUMBER) : 데이터 이름(duration)으로 명시
NUMBER 형태의 데이터가 오면 duration 필드에 저장

 

 

 

ex3) 55.3.244.1 GET /index.html 15824 0.043

%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

 

 

ex4)
POSTROUTING IN= OUT=eth0 SRC=192.168.99.82 DST=168.126.63.1 LEN=67 TOS=0x00 PREC=0x00 TTL=64 ID=57817 DF PROTO=UDP SPT=47683 DPT=53 LEN=47

%{WORD:iptables_filter} IN=%{WORD:in_device}? OUT=%{WORD:out_device}? SRC=%{IP:src_ip} DST=%{IP:dst_ip}.* TTL=%{INT:ttl}.* PROTO=%{WORD:proto}.* SPT=%{INT:src_port}.* DPT=%{INT:dst_port}.*




 

ex5) 2016-07-11T23:56:42.000+00:00 INFO [MySecretApp.com.Transaction.Manager]:Starting transaction for session -464410bf-37bf-475a-afc0-498e0199f008

%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log-level} \[%{DATA:class}\]:%{GREEDYDATA:message}

 


설명:
1) 2016-07-11T23:56:42.000+00:00 
%{TIMESTAMP_ISO8601:timestamp}
2) INFO
%{LOGLEVEL:log-level}
3) [MySecretApp.com.Transaction.Manager]

\[%{DATA:class}\]
4) Starting transaction for session -464410bf-37bf-475a-afc0-498e0199f008
%{GREEDYDATA:message}

ex6)
192.168.0.1 -- [11/Jun/2018:18:51:26 +0900] "GET /session.jsp HTTP/1.1" 200 1756

%{IP:ip} -- \[%{MONTHNUM:day}/%{MONTH:month}/%{YEAR:year}:%{HOUR:hour}:%{MINUTE:minute}:%{SECOND:second} %{ISO8601_TIMEZONE}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:num} %{NUMBER:num2}




ex6)
6월 11, 2018 5:59:01 오후 org.apache.catalina.core.ApplicationContext log 정보: No Spring WebApplicationInitializer types detected on classpath

%{MONTHNUM:month}월 %{MONTHDAY:day}, %{YEAR:year} %{HOUR:hour}:%{MINUTE:minute}:%{SECOND:second} (?<TIIME>[가-힣]{2}) %{DATA:path} log 정보:%{DATA:info}





ex7)
6월 11, 2018 5:58:58 오후 org.apache.catalina.startup.VersionLoggerListener log
정보: Server version: Apache Tomcat/7.0.82

%{MONTHNUM:month}월 %{MONTHDAY:day}, %{YEAR:year} %{HOUR:hour}:%{MINUTE:minute}:%{SECOND:second} (?<TIIME>[가-힣]{2}) %{DATA:path}\n정보:%{DATA:info}





위의 자료는 너무나 제가 원하는 자료라 가져왔습니다.

출처 : blog.naver.com/brilliantjay/221346745139

 

아래 사진은, 위의 예시처럼 사용하는 것을 보여주기 위한 것(kibana-dev tools)

* 정상적으로 data와 pattern 이 맞으면 Key : value 값으로 나타남

출처 : www.elastic.co/kr/blog/a-practical-introduction-to-logstash

 

-----------------------------------------------------------------------------------------------

위의 예시를 보고, grok patten 분석을 해봤다.(1시간 정도 걸렸다)

 

grokdebug.herokuapp.com/

 

Grok Debugger

One per line, the syntax for a grok pattern is %{SYNTAX:SEMANTIC}

grokdebug.herokuapp.com

아파치 로그 분석 2의 유형 자료를 보면 아래가 해당 로그 형태이다.

-> 10.128.2.1,[29/Nov/2017:06:59:03,GET /home.php HTTP/1.1,200 

 

 

-> 그림처럼 LOG에 그대로 적어준다.

 

* 그런 후에 patten에다가 무조건 순서대로 ip면 ip먼저 적어줘야 한다.(순서 다를 시 compile error 또는 no matchs)

 

하면서 꼭 알아야 할 점 ★

1. 자기 멋대로 띄어쓰기하면 안 됨. 똑같이 할 것(가독성 떨어짐) 

 

2. 특수문자는 역 슬래쉬(\)로 출력해줄 수 있음 ★★★★★

EX) , POST

답안 :\,%{WORD:method} 역 슬래쉬(\)로,를 출력해야 LOG 형태와 맞음

 

2-1. 다른 EX)

10.128.2.1,[29
%{IP:ip}\,\[%{MONTHDAY:day}

 

---------------------------------------------------------------------------------------------------

로그 형태 (로그 분석 실습 2)

10.128.2.1,[29/Nov/2017:06:59:03,GET /home.php HTTP/1.1,200

 

위의 로그 형태 패턴

%{IP:ip}\,\[%{MONTHDAY:day}/%{MONTH:month}/%{YEAR:year}\:%{HOUR:hour}\:%{MINUTE:minute}\:%{SECOND:second}\,%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\,%{NUMBER:num}

-> ★다시 한번 더 말하지만 가독성 때문에 띄어쓰기를 할 텐데, 절대 하지 말 것(에러 발생)

 

 

 

아래 사진

-> 결괏값(직접 하나하나 grok patten을 찾아서, 결과 값 제대로 나옴)

 

 

-----------------------------------------------------------------------------------------------------

logstash로 사용해보자.

 

파일명 : apache_log2.conf(로그 분석 실습 2 파일 -> 아파치 로그 형태가 아니다. 그냥 log 형태이다.)

-> elasticsearch, kibana 기동(명령 프롬프트 - 관리자)

 

apache_log2.conf
0.00MB

 

-> 2시간 넘게 grok patten으로 노가다 해보니, 한 번에 결괏값으로 출력되었다. 

-> 이제, conf를 수정하여, 불필요한 것(field)들을 제거해보자

 

-> conf를 수정해서 불필요한 것들을 삭제한 모습이다.

 

 

 

이제 마지막으로 output 부분을 수정해서 elasticsearch로 연동시켜줘서 시각화를 해보자.

 

apache_log2.conf
0.00MB

 

 

 

 

 

 

* 이제 진정한 아파치 로그에서 geoip를 사용해 볼 것이다.

* 해당 일반적인 log 형태에서는 사용할 수 없다.(내 생각 - 방법을 못 찾았다.)

반응형

댓글