Code

[ELK] logstash

February 4, 2016

[ELK] logstash

개요

  • 자바 기반으로 다양한 로그들을 수집하고 처리해서 내보낼수 있음.
  • 다양한 플러그인(input, filter, output) 을 제공하고 있는 것이 최대의 장점.

기본 실행

logstash -f <conf file>  

Conf 파일 내 구조

  • input, output 은 필수파라미터, filter 는 옵션
  • input 은 데이터소스에서 가져오는 플러그인
  • filter는 해당 데이터를 원하는 대로 변경하는 플러그인
  • output 은 Data Destination 으로 변경된 데이터를 쓰는 플러그인
[ELK] logstash


[ELK] logstash
간단하게 Apache acesslog 를 가져와서 JSON으로 변환하는 작업을 해보자.

first-pipeline.conf

input {  
  file {
    path => "/home/system/logs/test/access-2016-02-03.log"
    start_position => beginning
  }
}
filter {  
    grok {
        match => { "message" => "%{COMMONAPACHELOG}"}
    }
    geoip{
       source => "clientip"
   }
}
output {  
   stdout{ codec => json }
   elasticsearch{}
}
  • file input plugin 의 기본 동작은 beginning 으로 지정
  • unix의 tail -f와 동일. 특정 위치를 지정해서 logstash 의 파일에 대한 처리 시작 위치를 지정 할 수 있다.

grok filter plugin

  • 인입되는 데이터의 패턴을 찾아서 특정 필드들로 맵핑 변환
  • 패턴을 설정 해야 한다.
  • Apache accesslog 패턴 지정 : {%COMBINEDAPACHELOG%}

geoip filter plugin

  • IP 필드를 지정하면, 해당 IP를 통해서 지역 정보를 추출해 주는 작업

Check conf file

./logstash -f ./first-pipeline.conf --configtest
  • conf file 을 기반으로 작업이 수행되기 때문에 유효한지를 검사해야 한다.

결과

  • 아래의 결과를 보면, apache accesslog 로 들어오는 raw string 을 특정 필드로 맵핑된것을 볼 수 있다.
  • 또한 geoip 항목을 보면, 어디에서 접속했는지에 대한 위치정보를 가져와서 보여주고 있다.
  • 아래의 예제는 output 항목을 stdout 으로 설정했고 codec을 json으로 설정해서 아래와 같이 json 형식으로 보여지고 있다.
  • 다양한 output plugin을 지정해서 다른 분석 시스템이나, 데이터베이스로 로그를 보낼 수 있다.
{
    "message": "127.0.0.1 - - [03/Feb/2016:14:43:58 +0900] "POST /test/web HTTP/1.1" 200 22410",
    "@version": "1",
    "@timestamp": "2016-02-03T05:43:59.585Z",
    "path": "/home/system/logs/test/access-2016-02-03.log",
    "host": "0.0.0.0",
    "clientip": "127.0.0.1",
    "ident": "-",
    "auth": "-",
    "timestamp": "03/Feb/2016:14:43:58 +0900",
    "verb": "POST",
    "request": "/test/web",
    "httpversion": "1.1",
    "response": "200",
    "bytes": "22410",
    "geoip": {
        "ip": "127.0.0.1",
        "country_code2": "KR",
        "country_code3": "KOR",
        "country_name": "Korea, Republic of",
        "continent_code": "AS",
        "region_name": "13",
        "city_name": "Seongnam",
        "latitude": 37.43860000000001,
        "longitude": 127.13780000000003,
        "timezone": "Asia/Seoul",
        "real_region_name": "Kyonggi-do",
        "location": [127.13780000000003, 37.43860000000001]
    }
}

References

Array