logstash Grok Pattern 적용(Apache Access log) - 기본편(3)

    2편에서 Parsing한 데이터의 정확성 및 다양한 데이터로 확장 방법 소개
    1) Access log 요청 마친 시간으로 Parsing 시간을(@timestamp) 변경
    2) geoip plugin 적용하여 clientip 지도에 출력
    3) useragent plugin 적용

     

    1. Parsing된 timestamp, @timestamp 확인

    JSON에서는 Timezone 확인이 불가하니 Kibana를 통해 확인 필요
    kibana 설정으로 인해 한국시간(UTC+9)으로 자동 변경됨

    timestamp : 클라이언트 요청을 마친 시간(붉은색)
    @timestamp : parsing된 시간(UTC+0), JSON에서는 한국 시간(UTC+9)으로 변환 안됨(파란색) → Kibana에서 정상 표기됨
    즉, access log 시간과 parsing 시간이 다름

    timestamp와 @timestamp 다름
    timestamp와 @timestamp 다름

    2. timestamp 과 @timestamp 일치

    date filter 사용하여 timestamp의 타겟을 @timestamp로 변경

    ... 생략
    
    filter {
    	grok { match => { "message" => [ "%{IPORHOST:[clientip]} - - \[%{HTTPDATE:[timestamp]}\] \"%{WORD:[method]} %{DATA:[request]} HTTP/%{NUMBER:[http_version]}\" %{NUMBER:[response]} (?:%{NUMBER:[bytes]}|-)( \"%{DATA:[referrer]}\")( \"%{DATA:[agent]}\")" ] } }
    	
    	date { 
    		match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss +0900" ] 
    		target => "@timestamp"
        }
    	
    ... 생략

    timestamp의 형식이 다른경우 아래 "더보기" 참고

    더보기

    timestamp의 형식이 다른경우 아래 URL에서 형식에 맞춰 변경 필요함
    https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html
    예시) 2020-02-20 12:44:33 인 경우의 match 내용 

    date { 
    match => ["day", "yyyy-MM-dd HH:mm:ss"] 
    target => "@timestamp" 
    }

     

    json은 @timestamp UTC+0으로 적용됨 (timestamp와 @timestamp 다름)
    kibana는 UTC+9로 적용됨 (timestamp와 @timestamp 동일)

    3. geoip filter 적용

    [중요] geoip 적용하기전에 template에 geo_type 변경후 geoip 적용 
    [참고] Kibana Index Template 수정 방법(for. geo_ip) (https://dragon1.tistory.com/85)
    아래 가이드는 미적용상태에서 진행

    1) geoip에 clientip 정보 적용

    ... 생략
    
    filter {
    	grok { match => { "message" => [ "%{IPORHOST:[clientip]} - - \[%{HTTPDATE:[timestamp]}\] \"%{WORD:[method]} %{DATA:[request]} HTTP/%{NUMBER:[http_version]}\" %{NUMBER:[response]} (?:%{NUMBER:[bytes]}|-)( \"%{DATA:[referrer]}\")( \"%{DATA:[agent]}\")" ] } }
    	
    	date { 
    		match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss +0900" ] 
    		target => "@timestamp"
        	}
         
    	geoip {
            	source  => "clientip"
            }	
    	
    ... 생략

    하지만 JSON 에는 정상적용이 되었으나, kibana에는 표기 안됨

    geoip 값 표기됨
    geoip 값 표기 안됨

     


    2) geoip 필드 type 확인

    location필드가 geo_point 타입이 아님
    기본 조건('logstash-인덱스명' 사용, 하나의 필드 적용)에서 벗어나면 geo_point 타입의 자동 적용이 안됨 수동으로 Mapping 해야함

    location multi 필드 자동 적용 안됨

    3) 수동 매핑
    일반적으로 template에 적용하여 새롭게 생성되는 모든 인덱스에 매핑 시킴
    [참고] Kibana Index Template 수정 방법(for. geo_ip)

    location multi 필드 수동 적용
    geoip 값 표기됨

     

     

    4. Useragent filter 적용

    1) useragent filter 설정

    ... 생략
    
    filter {
    	grok { match => { "message" => [ "%{IPORHOST:[clientip]} - - \[%{HTTPDATE:[timestamp]}\] \"%{WORD:[method]} %{DATA:[request]} HTTP/%{NUMBER:[http_version]}\" %{NUMBER:[response]} (?:%{NUMBER:[bytes]}|-)( \"%{DATA:[referrer]}\")( \"%{DATA:[agent]}\")" ] } }
    	
    	date { 
    		match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss +0900" ] 
    		target => "@timestamp"
        	}
         
    	geoip {
            	source  => "clientip"
            }
            
    	useragent {
    		source => "agent"
    		target => "agents"
    	}
    	
    ... 생략
    agent 정보를 통해 os 및 브라우저 정보 표기
    kibana 에서도 정상 확인

     

    5. 끝

    댓글

    Designed by JB FACTORY