본문 바로가기
Data/ELK

[2021.03.31] 인턴 +30 Apache log concept과 로그 분석1

by injekim97 2021. 3. 31.
반응형

[2021.03.31] 인턴 +30  Apache log concept과 로그 분석1

 

 

아파치 로그 개념에 대해서 알아본 후, 로그 분석을 해보자.

 

 

 

 

자, 우선 Apache log가 어떻게 생겼고, 어떤 형태로 되어있는지 알아보기 위해 document를 참고해보자.

httpd.apache.org/docs/2.4/logs.html

 

로그파일 - Apache HTTP Server Version 2.4

로그파일 이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요. 효율적으로 웹서버를 관리하려면 발생하는 문제와 함께 서버의 활동과 성능에 대해 알아야 한다.

httpd.apache.org

-> Apache Log document

 

 

아파치 로그 분석1 (Apache log analysis 1)

 

Common 로그 형식

%h: 서버에 요청을 한 클라이언트(원격 호스트)의 IP 주소이다.

->EX) 127.0.0.1

 

%l: 출력에서 "빼기 기호"는 요청한 정보가 없음을 나타낸다.  

->EX) -

  

%u: HTTP 인증으로 알아낸 문서를 요청한 사용자의 userid이다.

-> EX) frank 

 

%t: 서버가 요청 처리를 마친 시간

-> EX) [10/Oct/2000:13:55:36 -0700] (%t)

 

\"%r\": 클라이언트의 요청 줄이 큰따옴표로 묶여있다. 

-> EX) "GET /apache_pb.gif HTTP/1.0" (\"%r\")

 

%>s: 서버가 클라이언트에게 보내는 상태 코드이다.

-> EX) 200

 

%b: 응답 헤더를 제외하고 클라이언트에게 보내는 내용의 크기를 나타낸다.

-> EX) 2326

 

\"%{Referer}i\" : 클라이언트가 참조했다고 서버에게 알린 사이트

-> EX) "http://www.example.com/start.html" (\"%{Referer}i\")

 

\"%{User-agent}i\" : 클라이언트 브라우저가 자신에 대해 알리는 식별정보이다.

-> EX) "Mozilla/4.08 [en] (Win98; I ;Nav)" (\"%{User-agent}i\")

 

 

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

예시) 실습할 log형태(아파치 로그 형태가 아님. 그래서 grok으로 하나씩 해줘야 함)

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

 

 

자, 이제 로그 패턴(log pattens)을 분석해보자

 

 

 

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 필드에 저장

 

 

예시) 로그 형태 (아파치 로그 분석 실습 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}

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

 

 

★★★★★★★★★★

해당 게시글에서, 로그 분석 실습2 게시글에 작성한 log patten을 직접 해봐야 함.(각 로그마다 형태가 다르기 때문에 그때마다 바꿔줘야 하기 때문에) 그러므로, 직접 해보자. (그리고 로그 패턴 안 맞음 -> 직접 하는 게 최고다.)

 

 

 

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

3. Logstash 적용 및 확인

1. elasticsearch.bat , kinaba.bat 기동 (관리자 권한으로 실행)

윈도우(OS) Logstash -> input file path 입력 시 주의 (역슬래시 사용 시 기동 안됨)

 

 

# access_log (LOG파일명)

255.255.255.134 - - [31/March/2021:10:52:58 +0900] "GET /apache.log HTTP/1.1" 200 9702 "https://injekim97.tistory.com/" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0)"

 

 

# apache_log(remove_field 성공확인).conf 파일

-> remove_field를 하기 위해서, 시간을 하루정도 투자하였음.(0401 기준)

apache_log(remove_field 성공확인).conf
0.00MB

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

실습을 하기 위해 apache_log 파일을 구해보자.

www.kaggle.com/nadamakram/apache-server-log

 

apache_server_log

 

www.kaggle.com

-> 해당 출처에서 apache_log.csv파일을 다운로드하였다. (캐글 로그인을 해야 파일을 다운로드할 수 있다)

-> 파일의 출처는 위의 작성자에게 있습니다.

 

Apache.log.csv
4.31MB

-> 이름 바꾸기로 해당.csv를 .log로 바꿔주면 로그파일 형태로 변환된다. (기억해두자)

 

Apache.log
4.31MB

-> 변환한 apache_log 파일이다.

 

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

이제 logstash로 실행해보자. (elasticsearch와 kibana 가 기동 되어 있어야 한다(명령 프롬포트))

 

 

 

-> C:\ElasticSearch\logstash-7.11.2\bin>logstash -f 파일명.conf (logstash 기동 방법-> powershell(관리자)

 

-> remove_field 전에, 보면 속성이 @version,tags,@timestamp,host,path,message가 있는데,

나는 @version,tags,host 이 3개를 지워보겠다.

* 지우기 위해선 아래 사진처럼 remove_field 에 내가 지우고자 할 속성 값을 그대로 넣어주면 된다.

 

-> 지우기 위해선, filter 안에 mutate {remove_field => ["@version","host","tags"]}지워줄 field명을 적어주면 된다.

* 당연하게도 위의 remove_field에선 4개가 지워진다 왜냐? @timestamp까지 적어줬기 때문이다.

* input file path에 역 슬래쉬가 아닌 슬래쉬(/)를 넣으니 잘 작동된다. 이점 기억하자

 

 

filter 후의 화면

-> 제거하고자 할(remove_field)를 지우고, 정상적으로 출력된 것을 알 수 있다.

* stdout을 dots{}로 하면. 출력되는 것을 알 수 있다.(.이 결괏값이라고 생각하면 된다)

 

-> elasticsearch에 index명 apache_log로 upload가 되었다.(결론은 성공했다.)

-> step1에  apache_log 그대로 치고 -> Next step 버튼 클릭 후 -> step2는 @timestamp를 클릭해주자.

 

-> tags를 보면, grok parse가 실패, 그리고 geoip도 실패이다. (다음 게시글에서 해결해보도록 하겠다)

 

+@ 21.04.02 해결 완료(맨 밑에 글 내용 확인할 것)

 

 

 

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

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

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

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

 

 

 

꿀팁  

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

 

 

 

 

 

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

geoip를 하면서 하게 된 후기(21.04.02)

-> logstash 할 때, 명령 프롬프트 보다 powershell이 빠르게 실행결과가 나온다. (powershell 사용하자)

-> 해당 게시글의 실습 1과 실습 2는 아파치 로그 형태가 아니다.(그냥 로그 형태다 -> 그렇기 때문에 grok으로 하나하나 판별해야 함)

-> geoip를 사용하기 위해서는, 무조건 완전한 apache_log 형태 형식을 가져야 한다.(일반 로그는 안됨)

WHY? -> %{COMBINEDAPACHELOG}를 사용할 수 없기 때문임.

 

결론, 해당 게시글은 아파치 로그 분석이 아닌, 그냥 로그 분석임. 참고할 것

 

반응형

댓글