[2021.03.31] 인턴 +30 Apache log concept과 로그 분석1
아파치 로그 개념에 대해서 알아본 후, 로그 분석을 해보자.
자, 우선 Apache log가 어떻게 생겼고, 어떤 형태로 되어있는지 알아보기 위해 document를 참고해보자.
httpd.apache.org/docs/2.4/logs.html
-> 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 파일을 구해보자.
www.kaggle.com/nadamakram/apache-server-log
-> 해당 출처에서 apache_log.csv파일을 다운로드하였다. (캐글 로그인을 해야 파일을 다운로드할 수 있다)
-> 파일의 출처는 위의 작성자에게 있습니다.
-> 이름 바꾸기로 해당.csv를 .log로 바꿔주면 로그파일 형태로 변환된다. (기억해두자)
-> 변환한 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}를 사용할 수 없기 때문임.
결론, 해당 게시글은 아파치 로그 분석이 아닌, 그냥 로그 분석임. 참고할 것
'Data > ELK' 카테고리의 다른 글
[2021.04.02] 인턴 +32 Apache log Analysis log file(3GB) - geoip 사용 O (0) | 2021.04.02 |
---|---|
[2021.04.01] 인턴 +31 log Analysis 2 (로그 분석 2) (0) | 2021.04.01 |
[2021.03.26] 인턴 +25 logstash filter 기능(사용법) (0) | 2021.03.26 |
[2021.03.24] 인턴 + 23 파일 비트란?(설치 및 실습 포함) (0) | 2021.03.24 |
[2021.03.24] 인턴 + 23 CSV 데이터 -> kibana 사용(실습) (0) | 2021.03.24 |
댓글