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 에 있는 아래 내용을 실행한다.
- Loading the Template Manually - required for Logstash output
처음 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