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

    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 
      }
    }

    9개 확인(agent/method/reqeust/http_version/response/referrer/bytes/timestamp/clientip)

     

    6. 끝

    다음회)
    1) access log 요청 마친 timestamp로 시간 적용하기(+ 타임존) 
    2) useragent 적용
    3) geoip 적용

    댓글

    Designed by JB FACTORY