ELK (draft)

https://www.elastic.co/guide/en/beats/libbeat/current/getting-started.html 문서보고 따라해보기

java 설치

https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04

# apt-get install default-jre
# update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Nothing to configure.
# cat /etc/environment  | grep JAVA
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"
# source /etc/environment
# echo $JAVA_HOME

ELK 설치 방법

바이너리 파일로 설치할 수도 있고 apt 로 설치할 수도 있음.

apt 로 설치하려고 할 경우 설정하기 https://www.elastic.co/guide/en/beats/libbeat/current/setup-repositories.html

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

logstash : port 5044

es : port 9200


ES 설치

ES :  메모리 1G 일때 에러가 나서 메모리 4096으로 세팅하였음.

https://www.elastic.co/guide/en/beats/libbeat/current/elasticsearch-installation.html : deb 설치

localhost에서만 접속가능하며 /etc/elasticsearch/elasticsearch.yml 파일을 설정하여 바꿀 수 있다. 

root@ubuntu-xenial:/etc/elasticsearch# ls /etc/elasticsearch/elasticsearch.yml
/etc/elasticsearch/elasticsearch.yml
root@ubuntu-xenial:/etc/elasticsearch# diff elasticsearch.yml.orig elasticsearch.yml
55a56
> network.host: 0.0.0.0

현재 상태를 조회하기 위해서는 API를 활용하면 된다.

Cluster APIs : https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster.html

사람에게 편한 cat APIs :  https://www.elastic.co/guide/en/elasticsearch/reference/current/cat.html

Cluster APIs는 json 으로 결과를 돌려주기 때문에 사람이 보기가 불편하다. 그래서 cat APIs를 사용하는 것이 편리하다. 위의 페이지를 보면 사용법은 간단하다.


# Cluster Health
$ curl -XGET 'localhost:9200/_cat/health?v&pretty'
# 노드 상태 확인하기
$ curl -XGET "http://localhost:9200/_cat/nodes?v&h=id,name,ip,port,v,m&s=name"



logstash 설치

https://www.elastic.co/guide/en/beats/libbeat/current/logstash-installation.html : deb 설치

logstash 프로그램 경로가 나와있지 않다. 

https://www.elastic.co/guide/en/logstash/5.6/dir-layout.html 참고하면 됨.

/usr/share/logstash/bin/logstash-plugin update logstash-input-beats 

위 프로그램실행시 java 프로그램을 못 찾는다고 나온다. 아래 설정을 하면 된다.

root@ubuntu-xenial:/etc/logstash# cat /etc/environment | grep JAVACMD
JAVACMD=`which java`

 Logstash pipeline configuration file  파일을 만들어야 한다고 하는데 /etc/logstash/conf.d/ 디렉토리에 만들어야  /var/log/logstash 에서 에러가 없었다.


logstash 가 정상작동하는지는 아래와 같이 테스팅을 할 수 있다.

https://www.elastic.co/guide/en/logstash/5.6/first-event.html

/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

kibana 설치

https://www.elastic.co/guide/en/beats/libbeat/current/kibana-installation.html#kibana-installation

tar 파일로 설치했다가 apt로 바꿈. 기본은 localhost에서만 접속이 된다. https://www.elastic.co/guide/en/kibana/current/settings.html 내용을 참고하여 conf/kibana.yml 파일 또는 /etc/kibana/kibana.yml 에서 server.host 를 "0.0.0.0" 으로 지정하고 kibana를 다시 띄우면 원격에서 접속이 되었다.

root@ubuntu-xenial:/etc/kibana# ls /etc/kibana/kibana.yml
/etc/kibana/kibana.yml
root@ubuntu-xenial:/etc/kibana# diff kibana.yml.orig kibana.yml
7a8
> server.host: "0.0.0.0"


그런데 위와 같이 설치하면 kibana에서 어떻게 검색을 할 수 있는지 몰라서 kibana Getting Started 의 내용을 보면서  샘플데이터 넣고 인덱스를 만들고 kibana 사용법을 익혀야 한다..

https://www.elastic.co/guide/en/kibana/current/getting-started.html

  • Load a sample data set into Elasticsearch
  • Define an index pattern
  • Explore the sample data with Discover
  • Set up visualizations of the sample data
  • Assemble visualizations into a Dashboard

sample data를 넣은 경우 아래의 명령으로 해당 인덱스가 있는지 확인을 할 수 있다. 

curl -XGET 'localhost:9200/_cat/indices?v&pretty'


이 문서를 계속 따라가면서 실습하는데 visualizations  은 이해 안되는 내용이 있었지만 그냥 따라 해 보았다.

https://www.elastic.co/guide/en/kibana/current/tutorial-visualizing.html

filebeat 설치

https://www.elastic.co/guide/en/beats/filebeat/5.6/filebeat-getting-started.html


apt 등록을 하고 설치하는게 편리하다.

https://www.elastic.co/guide/en/beats/filebeat/5.6/setup-repositories.html

filebeat 설치

sudo apt-get update && sudo apt-get install filebeat
sudo systemctl enable filebeat


filebeat 설정  : output을 elasticsearch 대신 logstash로 설정을 해야 함. logstash에서도 설정을 해야 함.   https://www.elastic.co/guide/en/beats/filebeat/5.6/config-filebeat-logstash.html

logstash 설정은 https://www.elastic.co/guide/en/beats/libbeat/5.6/logstash-installation.html#logstash-setup 에 나와 있다.

elasticsearch대신 logstash로 보낼 경우  load the index template into Elasticsearch manually  를 해야 한다고 나와있다. 

https://www.elastic.co/guide/en/beats/filebeat/5.6/filebeat-template.html 에 있는 아래 내용을 실행한다.


처음 filebeat 설치시 설정

$ cat /etc/filebeat/filebeat.yml  | egrep -v '(^\s)*#|^$'
filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/*.log
output.elasticsearch:
  hosts: ["localhost:9200"]

elasticseach 대신 logstash로 변경 : 사전에 logstash 에서 filebeat 를 받을 수 있도록 설정해야 함.

# cat filebeat.yml | egrep -v '(^\s)*#|^$'
filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/*.log
output.logstash:
  hosts: ["localhost:5044"]


logstash 에서 filebeat 를 받을 수 있도록 설정하기  https://www.elastic.co/guide/en/beats/libbeat/5.6/logstash-installation.html#logstash-setup

Updating the Beats Input Plugin for Logstash

logstash를 재시작해준다.

# cat /etc/logstash/conf.d/logstash.conf
input {
  beats {
    port => 5044
  }
}

# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }

output {
  elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}
# /usr/share/logstash/bin/logstash-plugin update logstash-input-beats 

logstash grok test

Getting Started with Logstash 문서를 보고 테스팅을 해 보았다. 아래 문서를 보면 어떻게 logstash 에서 파싱을 하는지 나와있다. 

https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html

https://www.elastic.co/guide/en/logstash/current/multiple-input-output-plugins.html


이 문서를 보면 filebeat, logstash를 서비스로 띄우지 않고 필요한 부분만 테스팅 하는 방법을 설명하고 있다. 디버깅 할 때는 편리할 것 같다.

아래는 Getting Started with Logstash  문서를 다 읽고 테스팅을 한 내용이므로 해당 문서를 보면서 테스팅을 각각 해봐야 한다.

먼저 filebeat, logstash 서비스를 내려 놓는다.

# systemctl stop filebeat
# systemctl stop logstash


일단 테스팅했던 코드만 나열..

filebeat : /var/log/nginx/access.log, /var/log/*.log 파일을 전송하도록 설정을 함. fileds 를 추가하여 log_type으로 구분을 할 수 있도록 하였음. nginx 는 먼저 설치가 되어서 정상적으로 돌아가고 있어야 한다.

# cat /etc/filebeat/filebeat.test.yml
filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/nginx/access.log
  fields:
    log_type: nginx
    logsource: taejoon_desktop
- input_type: log
  paths:
    - /var/log/*.log
  fields:
    log_type: syslog

output.logstash:
  hosts: ["localhost:5044"]
# filebeat.sh -e -c filebeat.test.yml -d "publish"

filebeat 명령을 실행하면 해당 로그를 logstash로 보내려고 시도를 한다. 

계속 업데이트되는 파일이 아니라 샘플데이터 파일을 가져와서 실행을 하는 경우 filebeat 에서 다시 정보를 보내려면 /var/lib/filebeat/registry 파일을 지우고 filebeat 를 실행하면 된다.


이제 logstash 테스팅 파일을 만든다.

# cat /etc/logstash/grok/nginx
NGINXACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:time_local}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\"

# cat /etc/logstash/conf.d/test.conf
input {
  beats {
    port => 5044
  }
}

filter {
   if [fields][log_type] == "nginx" {
    grok {
#        match => { "message" => "%{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:time_local}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\""}
        match => { "message" => "%{NGINXACCESS}"}
        patterns_dir => ["/etc/logstash/grok"]
    }
   }
}

output {
   if [fields][log_type] == "nginx" {
        stdout { codec => rubydebug }
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index    => "nginx-%{+YYYY.MM.dd}"
        }
    }

   if [fields][log_type] == "syslog" {
        stdout { codec => rubydebug }
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index    => "syslog-%{+YYYY.MM.dd}"
        }
    }
}

몇가지 설명

  • grok를 이용하여 nginx 로그파일에서 필요한 필드를 뽑아내고 있다. 위의 예는 nginx 기본 로그파일 포맷을 이용하는 것이며 해당 로그 패턴은 /etc/logstash/grok 디렉토리에 만들어 두었다.
  • output에서 stdout { codec => rubydebug } 부분은 콘솔에서 바로 출력하도록 하는 부분임. 디버깅용.

설정파일에 문제가 없는지 확인을 한다. warning 메시지는 나오지만 설정파일에 문제가 있는지 확인은 한다.

# /usr/share/logstash/bin/logstash -f test.conf --config.test_and_exit
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path //usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
Configuration OK

설정파일에 문제가 없으면 테스팅 설정파일을 이용하여 logstash를 띄운다. --config.reload.automatic 옵션은 설정파일을 변경하는 경우 자동으로 읽어들이도록 하는 옵션이다.

# /usr/share/logstash/bin/logstash -f test.conf --config.reload.automatic



Related pages