본문 바로가기

DevOps __

ELK 스택과 FileBeat 사용

#  ElasticSearch + LogStash + Kibana + filebeat 을 이용한 데이터분석


  • 동작 방식

# ELK stack을 한 서버에 구축하며, 각 클라이언트 별 filebeat를 이용하여 로그를 수집한다.

  • filebeat로 부터 로그를 수집한 후 logstash로 보내진다.
  • logstash에서 데이터를 정제한 후 elasticsearch로 전달한다.
  • 최종적으로 elasticsearch에 데이터를 kibana로 visualizing 한다.

 


LogStash

  • 로그파일을 필요 용도에 맞게 정제를 한다.
  • 항상 logstash 를 실행 시   tail -f /var/log/logstash/logstash-plain.log  켜서 에러가없이 포트가 정상적으로 열리는지 확인한다. 문제가 없을 시 port가 열리고나면 로그가 적재되지않는다.
  • 제일 많이 오류가 발생하는 부분이 오타일 경우가 많다.
  • 현재 여러 conf 파일들을 사용할 때, 하나의 conf파일이 먼저 실행되면 다음 conf 파일들은 인식을 못하고 기본 source 정보만 저장된다. 명확한 이유는 찾지못했고, logstash가 a b c 순으로 파일을 처리하는 부분에 있어 여러 conf 파일을 드나들 때 문제가 있다는 내용이 있다. pipeline id를 추가하는 방법이 해결방안으로 나와있는데, 현재 안됨.
  • 그래서 하나의 conf파일에 IF문등 조건식을 사용하여 파일을 분배해 filtering 하고 있다.
  • 또 conf 파일별로 포트를 같게 주면 오류가 발생하여 만약 여러개의 conf 파일을 사용하려면 각각 포트번호를 다르게 주어야한다.

elastico 에 rpm 다운 기준 /etc/logstash/conf.d/ 경로를 사용.

*.conf    양식으로 파일을 생성.  

--기본구조

 

input {

  beats {

     port => 5044              # filebeat과 통신을 위해 사용할 포트

  }

}

 

filter {

 

}

 

output {

   elasticsearch {

     hosts => ["http://localhost:9200"]                  # elasticsearch 위치

     index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"           # index명 임의로 지정가능

   }

}

 

filter

- grok : 패턴 매칭을 사용해서 추출

- date : 필드로 부터 timestamp 파싱함

- mutate : 이벤트에서 필드를 rename, remove, replace, modify

- csv : CSV 데이터 형태로 파싱함

- geoip : IP 주소로 지리를 판단

- kv : 이벤트 데이터에서 key-value 쌍을 파싱함

- ruby : 파이프라인에서의 모호한 Ruby code 실행될때 등등

 

  • grok을 이용해 로그내용을 key , value 형태로 저장할 수 있다.
  • 정규표현식을 이용하기 때문에 정규표현식을 이해하면 좋다.
  • 보통 message 필드를 match하여 해당 내용을 조각낸다.
  • 이때 정규표현식 또는 자체적으로 제공하는 pattern을 이용하여 데이터를 추출해내어 key,value 형태로 저장할 수 있다.
  • https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns  자체적으로 제공하는 pattern 식
  • 제공된 패턴 사용시 %{패턴명} , 자체적으로 패턴을 만들어 사용할때 (?<패턴명>추출할 양식=정규표현식)
  • if문 사용이 가능하다. 여러가지 방식으로 이용가능.
  • https://grokdebug.herokuapp.com/ 해당 표현식이 정삭적으로 작동하는지 디버깅해주는 사이트\

 

  • & 자주쓰는 정규표현식

\s  :  스페이스 (= %{SPACE})

\w : 특수문자를 제외한 문자와 숫자를 추출

\d : 숫자를 추출

특수문자를 문자처럼 사용시 앞에 \를 붙여주고 사용할 것

...등등

필요없는 필드는 remove_field 를 이용하여 지울수있다.

  • grok 부분에 사용할 수도 있고, mutate를 이용할 수 도 있다.

-- mutate { remove_field => [ "a", "message","beat","host","input","meta","log","@version","offset","prospector" ] }              # 필요없는 필드는 지운다.

 

ex) 이 로그를 필터로 정제.

2019/01/10 07:01:07 [error] 23986#23986: *29 open() "/var/www/html/404.html" failed (2: No such file or directory), client: 1.1.1.1, server: ji.com, request: "GET /test.php HTTP/1.1", host: "2.2.2.2"

 

  • filter 부분

filter {
  grok {
    match => { "message" => ["(?<log_time>%{DATE}\s%{TIME})\s\[%{DATA:title}\]\s%{DATA:identified}\s(?<status>%{DATA}\s%{DATA})\s\"%{DATA:path}\"\s%{DATA:event},\sclient\:\s%{IP:cilent},\sserver\:\s%{DATA:server},\srequest\:\s\"%{DATA:request}\",\shost\:\s\"%{IP:host}\"%{GREEDYDATA:hint}"] }
  }
}


* 결과 :

"server": "ji.com",
"request": "GET /test.php HTTP/1.1",
"title": "error",
"log_time": "19/01/10 07:01:07",
"cilent": "1.1.1.1",
"path": "/var/www/html/404.html",
"identified": "23986#23986:",
"hint": "",
"host": "2.2.2.2",
"event": "failed (2: No such file or directory)",
"status": "*29 open()"


& geoip 

  • IP를 기반으로 지역정보를 추출한다.
  • filter 에 작성한다.

grok 부분에서 IP를 패턴으로 추출하였다면 이 키값을 geoip 에 매칭시키면 된다.

ex)    client 값에 IP 정보가 있다.

geoip {

   source => "client"

   target => "geoip"

}

이렇게하면 client값에 대한 지역정보가 담긴 값들이 key:value 형태로 저장되어진다.

 

  • geoip.city_name

  • geoip.continent_code

  • geoip.country_code2

  • geoip.country_code3

  • geoip.country_name

  • geoip.dma_code

  • geoip.ip

  • geoip.latitude

  • geoip.location.lat

  • geoip.location.lon

  • geoip.longitude

  • geoip.postal_code

  • geoip.region_code

  • geoip.region_name

  • geoip.timezone

해당 데이터들이 저장됨.

 


정제된 데이터는 elasticsearch로 전송된다.

  • curl -X DELETE 'http://localhost:9200/[data명 or _all]'                # 특정 인덱스만 지우거나 모든 데이터를 지운다.

  • elasticsearch head 를 사용해 웹형식으로 관리할 수도 있다.              # 9100포트를 이용한다.
  • https://github.com/mobz/elasticsearch-head                                # github 에서 제공하는 source를 이용
  • 기본적으로 elasticsearch 와 연동된 kibana를 구동할때 데이터가 elasticsearch에 저장되는데, 혹시 모든데이터를 지웠을 경우 kibana를 재시작해준다. 

Kibana 를 이용해 데이터를 시각화한다.

  • elasticsearch에 쌓여진 인덱스들은 kibana에서 확인이 가능하다.
  • 인덱스를 분석하고 visualizing 하기 위해서는 index pattern을 생성해준다.

  • 생성된 index pattern은 Discover 탭에서 확인가능하다.
  • 앞서 logstash에서 넘겨준 데이터가 잘 정제되어 들어왔는지 확인한다.       
  • # 참고 : tags 필드에  failure 단어가 포함된 메시지값이 있다면 필터쪽에서 해당 작업이 실패했다는 것.

  • 특정 데이터를 보기 좋게 시각화작업을 할 수 있다.
  • 먼저 Visualize 탭에서 만들고 Dashboard에 보기좋게 꾸며준다.

 

정규표현식이 많이 필요하군요..


THE END.

 

 

 

'DevOps __' 카테고리의 다른 글

Zabbix (Alert -> Slack)  (0) 2019.11.04
Zabbix (Alert -> Mail)  (0) 2019.11.04
NFS 구성  (0) 2019.11.04
Ansible 구성  (0) 2019.11.04
Zabbix 모니터링  (0) 2019.05.08