Debian に ELK Stack + Filebeat をインストールする方法です。
最新版では、すべて Debian パッケージからインストールすることが可能です。
Apache のアクセスログを収集・分析することを前提としています。
- Debian jessie 8.6
- Java SE Runtime Environment 8
- Elasticsearch 2.4.1
- Elasticsearch Curator 4.1.2
- Logstash 2.4.0
- Kibana 4.6.1
- Filebeat 1.3.1
Name | Overview | Implementation |
---|---|---|
Elasticsearch | Apache Lucene (全文検索エンジン) を基盤とするスケーラブルな検索エンジン | Java |
Logstash | データの収集と転送のための高機能なツール | JRuby |
Kibana | データの分析と可視化ための Web フロントエンドツール | Node.js |
Beats | データの収集と転送ための軽量なツール | Golang |
Name | Overview |
---|---|
Cluster | 同じ名前を持つひとつ以上のノードの集合 |
Node | Elasticsearch のインスタンス(クラスターを構成するサーバー) |
Index | 論理的なデータの保存単位(RDB のデータベースに相当) |
Type | インデックスに格納するドキュメントの種類(RDB のテーブルに相当) |
Document | 情報の基本単位(RDB のレコードに相当) |
Field | ドキュメントが持つ項目(RDB のカラムに相当) |
Mapping | ドキュメントの個々のフィールドに対する振る舞い定義(RDB のテーブルスキーマに相当) |
Analyzer | ドキュメントの解析装置(Tokenizer と Filter によって構成される) |
Tokenizer | 文字列の解析装置(多数の実装が存在) |
Filter | 文字列の解析前後の加工処理(前処理は Character filters、後処理は Token filters) |
Shard | インデックスの分割保存場所(分散処理に対応) |
Primary Shard | 書き込み可能なシャード(デフォルトでは5個のシャードが作成される) |
Replica Shard | プライマリ・シャードのコピー(別ノードに保存される待機系シャード) |
Elasticsearch と Logstash の稼働には、Java 7 以上が必要なので最新版の JRE をインストールします。
JRE 8 のインストールには、backports リポジトリの追加が必要です。
$ echo "deb http://http.debian.net/debian jessie-backports main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get install openjdk-8-jre
$ java -version
Elasticsearch をインストールします。
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update
$ sudo apt-get install elasticsearch
パッケージのアップデートに失敗した場合は、apt-transport-https
をインストールしてください。
$ sudo apt-get update
E: メソッドドライバ /usr/lib/apt/methods/https が見つかりません。
N: パッケージ apt-transport-https はインストールされていますか?
$ sudo apt-get install apt-transport-https
OS 起動時に自動起動するように設定します。
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable elasticsearch.service
Elasticsearch の設定ファイルを編集します。
クラスタ名、ノード名の設定は任意です。
メモリがスワップしないように JVM 起動時にメモリを確保するようにし、外部から HTTP 接続できるようにネットワークホストを変更します。
$ sudo vi /etc/elasticsearch/elasticsearch.yml
cluster.name: elasticsearch
node.name: ${HOSTNAME}
bootstrap.memory_lock: true
network.host: 0.0.0.0
もうひとつの設定ファイルでは、Elasticsearch が使用する Java のヒープサイズを設定します。
$ sudo vi /etc/default/elasticsearch
ES_HEAP_SIZE=2g
サービスを再起動し、稼働状態を確認します。
$ sudo service elasticsearch restart
$ curl localhost:9200
{
"name" : "debian86",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "_pcf0vKBSEuJYuFwHycXSw",
"version" : {
"number" : "2.4.1",
"build_hash" : "c67dc32e24162035d18d6fe1e952c4cbcbe79d16",
"build_timestamp" : "2016-09-27T18:57:55Z",
"build_snapshot" : false,
"lucene_version" : "5.5.2"
},
"tagline" : "You Know, for Search"
}
Apache のアクセスログ用のインデックステンプレートを作成します。
ログデータなどは日付毎にインデックス化されることが多いため、インデックステンプレートの登録が必要になります。
template
の値にマッチする Index
が作成されると、このテンプレートが自動で適用されます。
下記の例では、refresh_interval
を10秒に変更することにより負荷を軽減し、すべての string
型の項目を解析の対象から外しています。
$ vi ~/apache_template.json
{
"template": "apache-*",
"settings": {
"index.refresh_interval": "5s"
},
"mappings": {
"_default_": {
"dynamic_templates": [ {
"strings": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "{dynamic_type}",
"index" : "not_analyzed",
"omit_norms": true,
"ignore_above": 256
}
}
} ],
"properties": {
"@version": {
"type": "string",
"index": "not_analyzed"
},
"bytes": {
"type": "integer"
},
"clientip": {
"type": "ip"
},
"response": {
"type": "short"
},
"timestamp": {
"type": "date",
"format": "dd/MMM/YYYY:HH:mm:ss Z"
}
}
}
}
}
作成したインデックステンプレートを Elasticsearch に登録します。
$ curl -XPUT localhost:9200/_template/apache_template?pretty -d "`cat ~/apache_template.json`"
Elasticsearch に登録されているインデックステンプレートを確認します。
$ curl -XGET localhost:9200/_template/?pretty
Elasticsearch cluster のための Web フロントエンドである elasticsearch-head をインストールします。
Web ブラウザ上でクラスターやノード、インデックスの情報が簡単に閲覧でき、検索クエリの発行などが可能です。
$ cd /usr/share/elasticsearch
$ sudo bin/plugin install mobz/elasticsearch-head
ブラウザから下記のURLにアクセスし、正常に稼働していることを確認します。
http://domain:9200/_plugin/head/
Elasticsearch をインストールしたサーバーに Elasticsearch Curator をインストールします。
Elasticsearch Curator は、Elasticsearch のインデックスやスナップショットの管理ツールです。
このツールを使用して、定期的に古いインデックスをクローズしたり削除したりします。
$ echo "deb https://packages.elastic.co/curator/4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install elasticsearch-curator
実行ユーザーのデフォルトパスに設定ファイルを作成します。
$ mkdir ~/.curator
$ vi ~/.curator/curator.yml
client:
hosts:
- 127.0.0.1
port: 9200
url_prefix:
use_ssl: False
certificate:
client_cert:
client_key:
ssl_no_validate: False
http_auth:
timeout: 30
master_only: False
logging:
loglevel: INFO
logfile:
logformat: default
blacklist: ['elasticsearch', 'urllib3']
任意の場所にアクションファイルを作成します。
下記の例では、apache-
プリフィックスの古いインデックスを削除するアクションを定義しています。
$ vi ~/.curator/action.yml
actions:
1:
action: delete_indices
description: "Delete old indices of apache- prefix"
options:
ignore_empty_list: True
timeout_override:
continue_if_exception: False
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: apache-
exclude:
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 90
exclude:
作成したアクションを試運転します。
$ curator --dry-run ~/.curator/action.yml
2016-10-12 21:24:39,670 INFO Preparing Action ID: 1, "delete_indices"
2016-10-12 21:24:39,677 INFO Trying Action ID: 1, "delete_indices": Delete old indices of apache- prefix
2016-10-12 21:24:39,712 INFO DRY-RUN MODE. No changes will be made.
2016-10-12 21:24:39,712 INFO (CLOSED) indices may be shown that may not be acted on by action "delete_indices".
2016-10-12 21:24:39,713 INFO DRY-RUN: delete_indices: apache-2016.07.10 with arguments: {}
2016-10-12 21:24:39,713 INFO DRY-RUN: delete_indices: apache-2016.07.11 with arguments: {}
2016-10-12 21:24:39,713 INFO Action ID: 1, "delete_indices" completed.
2016-10-12 21:24:39,713 INFO Job completed.
config
オプションで設定ファイルのパスを指定することも可能です。
$ curator --dry-run --config ~/.curator/curator.yml ~/.curator/action.yml
crontab でジョブをスケジューリングします。
$ sudo crontab -e
0 5 * * * curator ~/.curator/action.yml > /dev/null 2>&1
設定を反映させるため cron を再起動します。
$ sudo service cron restart
Elasticsearch をインストールしたサーバーに Logstash をインストールします。
$ echo "deb https://packages.elastic.co/logstash/2.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install logstash
OS 起動時に自動起動するように設定します。
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable logstash.service
Logstash の設定ファイルを編集します。
メッセージのフォーマットやインデックス名などは必要に応じて変更してください。
date
を指定することで @timestamp
の値を指定した項目の値に設定可能です。デフォルトではデータを読み込んだ日付がセットされます。
また、output
の index
を apache-%{+YYYY.MM.dd}
にすることにより、日毎に Index
が作成されるようにします。
$ sudo vi /etc/logstash/conf.d/01-beats.conf
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
locale => en
}
useragent {
source => "agent"
target => "useragent"
}
}
output {
elasticsearch {
hosts => "localhost:9200"
manage_template => false
index => "apache-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
設定ファイルに問題がないかチェックした後、サービスを再起動し、稼働状態を確認します。
$ sudo service logstash configtest
Configuration OK
$ sudo service logstash restart
$ sudo service logstash status
パッケージに同梱されている Logstash plugins は、下記のコマンドで簡単に確認できます。
$ /opt/logstash/bin/logstash-plugin list --verbose
logstash-codec-collectd (2.0.4)
logstash-codec-dots (2.0.4)
logstash-codec-edn (2.0.4)
logstash-codec-edn_lines (2.0.4)
...
Elasticsearch をインストールしたサーバーに Kibana をインストールします。
Kibana 4 には、HTTP サーバがバンドルされているため、別途インストールする必要はありません。
$ echo "deb https://packages.elastic.co/kibana/4.6/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install kibana
OS 起動時に自動起動するように設定します。
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable kibana.service
サービスを起動し、稼働状態を確認します。
$ sudo service kibana start
$ sudo service kibana status
ブラウザから下記のURLにアクセスし、正常に稼働していることを確認します。
Apache が稼働しているログ収集元のサーバーに Filebeat をインストールします。
パッケージのアップデートに失敗した場合は、apt-transport-https
をインストールしてください。
Filebeat の稼働には JRE は必要ありません。
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install filebeat
OS 起動時に自動起動するように設定します。
$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable filebeat.service
Filebeat の設定ファイルを編集します。
収集するログファイルのパスを任意のパスに変更します。
また、デフォルトでは Elasticsearch にアウトプットするようになっている為、Logstash にアウトプットするように変更します。
$ sudo vi /etc/filebeat/filebeat.yml
############################# Filebeat ######################################
filebeat:
# List of prospectors to fetch data.
prospectors:
paths:
- /var/log/apache2/access.log
document_type: access-log
############################# Output ########################################
output:
### Elasticsearch as output
#elasticsearch:
#hosts: ["localhost:9200"]
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["XXX.XXX.XXX.XXX:5044"]
サービスを再起動し、稼働状態を確認します。
$ sudo service filebeat restart
$ sudo service filebeat status