Grok Pattern을 사용하여 사용자가 원하는 데이터로 Parsing 해보자
1. 사용할 Apache Access Log 데이터 확인
# Access Log 예시
1.2.3.4 - - [28/Apr/2019:00:01:58 +0900] "GET /assets/css/reset.css HTTP/1.1" 200 1075 "https://www.example.com/login/form.do" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
항목 | 설명 | 사용여부 |
1.2.3.4 | IP | Y |
- | 클라이언트의 RFC 1413 신원 | N |
- | 사용자의 userid | N |
[28/Apr/2019:00:01:58 +0900] | 요청 마친 시간 | Y |
GET | 사용자 요청 Method | Y |
/assets/css/reset.css | 요청 자원 | Y |
HTTP/1.1 | HTTP Protocol 버전 | Y |
200 | 상태코드 | Y |
1075 | 클라이언트에게 보내는 내용의 크기 | Y |
https://www.example.com/login/form.do | 클라이언트가 참조했다고 서버에게 알린 사이트 | Y |
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko | 클라이언트 브라우저가 자신에 대해 알리는 식별정보 | Y |
2. Grok Pattern 사용 방법
1) 기본 문법
%{SYNTAX:SEMANTIC}
SYNTAX = 텍스트와 일치하는 패턴의 이름
SEMANTIC = 식별자
3. Grok Pattern 작성
내장 Pattern 및 정규 표현식 사용하여 Parsing
[참고] 내장 Pattern URL
( https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns )
# Grok Pattern 예시 %{IPORHOST:[clientip]} - - \[%{HTTPDATE:[timestamp]}\] \"%{WORD:[method]} %{DATA:[request]} HTTP/%{NUMBER:[http_version]}\" %{NUMBER:[response]} (?:%{NUMBER:[bytes]}|-)( \"%{DATA:[referrer]}\")( \"%{DATA:[agent]}\") |
Pattern 항목 (붉은색은 정규표현식으로 Parsing 데이터에서 제외됨) |
Pattern 설명 |
%{IPORHOST:[clientip]} | 내장 Pattern |
- | 미적용 항목이며 그대로 입력 |
- | 미적용 항목이며 그대로 입력 |
\[%{HTTPDATE:[timestamp]}\] | \[ ,\] 대괄호 제외(정규표현식) 후 Parsing |
\"%{WORD:[method]} %{DATA:[request]} HTTP/%{NUMBER:[http_version]}\" | \" ,\" 쌍따옴표, HTTP/ 제외(정규표현식) 후 Parsing |
%{NUMBER:[response]} | 내장 Pattern |
(?:%{NUMBER:[bytes]}|-) | 전송 바이트 존재하면 Number 표기 전송 바이트 존재하지 않으면("-") Null 표기 |
( \"%{DATA:[referrer]}\") | \" ,\" 쌍따옴표 제외(정규표현식) 후 Parsing |
( \"%{DATA:[agent]}\") | \" ,\" 쌍따옴표 제외(정규표현식) 후 Parsing |
4. Grok Pattern 테스트
5. Logstash 적용 및 확인
[참고1] ELK Stack 설치 확인하여 Logstash 기동( https://dragon1.tistory.com/78 )
[참고2] 윈도우 환경의 Logstash 인 경우 input file path 주의 (역슬래시 사용시 기동안됨 )
# access_log
1.2.3.4 - - [28/Apr/2019:00:01:58 +0900] "GET /assets/css/reset.css HTTP/1.1" 200 1075 "https://www.example.com/login/form.do" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
# logstash-apache-access-log.conf
input {
file {
path => "D:/apps/elk/data/access.log"
start_position => "beginning"
codec => plain { charset => "CP949" }
}
}
filter {
grok { match => { "message" => [ "%{IPORHOST:[clientip]} - - \[%{HTTPDATE:[timestamp]}\] \"%{WORD:[method]} %{DATA:[request]} HTTP/%{NUMBER:[http_version]}\" %{NUMBER:[response]} (?:%{NUMBER:[bytes]}|-)( \"%{DATA:[referrer]}\")( \"%{DATA:[agent]}\")" ] } }
mutate { remove_field => [ "host" ] }
}
output {
stdout {
codec => rubydebug
}
}
6. 끝
다음회)
1) access log 요청 마친 timestamp로 시간 적용하기(+ 타임존)
2) useragent 적용
3) geoip 적용
'ELK stack > 02.Logstash' 카테고리의 다른 글
[Filter Plugins] CSV → Logstash → ES 저장 방법 (0) | 2020.03.03 |
---|---|
logstash Grok Pattern 적용(Apache Access log) - 기본편(3) (0) | 2020.02.13 |
logstash Grok Pattern 적용(Apache Access log) - 기본편(1) (0) | 2020.02.12 |