CLOVER🍀

That was when it all began.

Ubuntu LinuxにLogstashをインストールする

これまで、ElasticsearchとKibanaをちょくちょくと扱ってきたのですが、Logstashも少し触っておこうと
思いまして。

Logstash | データの一元化、変換、保管 | Elastic

ドキュメントは、こちら。

Logstash Reference [5.1] | Elastic

Logstash自体は、ログなどを収集して加工、他のデータストアなどに保存していくための
ソフトウェアですね。

まずは、インストールを行ってみます。インストール先は、Ubuntu Linuxとします。

ドキュメントは、こちらを参照してパッケージインストールします。

Installing Logstash | Logstash Reference [5.1] | Elastic

なお、JDKはインストール済みとします。

インストール

次のように入力してインストール前の準備。

$ 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
$ sudo apt-get update

インストール。

$ sudo apt-get install logstash

バージョンを指定してインストールする場合は、こちら。

$ sudo apt-get install logstash=1:5.1.1-1

起動と停止

Logstashの起動。

$ sudo systemctl start logstash.service

停止。

$ sudo systemctl stop logstash.service

ディレクトリ構成

設定ファイルは、「/etc/logstash」ディレクトリ。

$ ls -l /etc/logstash
total 24
drwxrwxr-x 2 root root 4096 Dec  6 13:18 conf.d
-rw-rw-r-- 1 root root 1738 Dec  6 13:12 jvm.options
-rw-rw-r-- 1 root root 1334 Dec  6 13:12 log4j2.properties
-rw-rw-r-- 1 root root 4487 Dec 27 17:45 logstash.yml
-rw-rw-r-- 1 root root 1659 Dec  6 13:12 startup.options

pipelineの設定は、「/etc/logstash/conf.d」に配置。

$ ls -l /etc/logstash/conf.d
total 0

「/var/log/logstash」ディレクトリにログ。

$ ls -l /var/log/logstash
total 8
-rw-r--r-- 1 logstash logstash 5401 Dec 27 17:51 logstash-plain.log

バイナリなどは、「/usr/share/logstash」ディレクトリ。

$ ls -l /usr/share/logstash
total 184
-rw-rw-r-- 1 logstash logstash 111569 Dec  6 13:12 CHANGELOG.md
-rw-rw-r-- 1 logstash logstash   2249 Dec  6 13:12 CONTRIBUTORS
-rw-rw-r-- 1 logstash logstash   3834 Dec  6 13:17 Gemfile
-rw-rw-r-- 1 logstash logstash  21182 Dec  6 13:12 Gemfile.jruby-1.9.lock
-rw-rw-r-- 1 logstash logstash    589 Dec  6 13:12 LICENSE
-rw-rw-r-- 1 logstash logstash    149 Dec  6 13:12 NOTICE.TXT
drwxrwxr-x 2 logstash logstash   4096 Dec 27 17:45 bin
drwxrwxr-x 3 logstash logstash   4096 Dec 27 17:48 data
drwxrwxr-x 5 logstash logstash   4096 Dec 27 17:45 lib
drwxrwxr-x 4 logstash logstash   4096 Dec 27 17:45 logstash-core
drwxrwxr-x 3 logstash logstash   4096 Dec 27 17:45 logstash-core-event-java
drwxrwxr-x 3 logstash logstash   4096 Dec 27 17:45 logstash-core-plugin-api
drwxrwxr-x 3 logstash logstash   4096 Dec 27 17:45 logstash-core-queue-jruby
drwxrwxr-x 4 logstash logstash   4096 Dec 27 17:45 vendor

動作確認

それでは、動作確認してみましょう。

お試し的に、ApacheアクセスログをElasticsearchに取り込んでみます。Elasticsearchは、
起動済みとします。

アクセスログは、apache_log_genでダミーで用意します。

GitHub - tamtam180/apache_log_gen: generate dummy apache log.

apache_log_genのインストール。

$ gem install apache-loggen

ログを100000ほど、秒間100で生成してみます。

$ apache-loggen --limit=100000 --rate=100 access-log

確認。

$ wc -l access-log 
100001 access-log


$ head -n 5 access-log 
88.51.41.78 - - [27/Dec/2016:18:00:23 +0000] "GET /item/garden/2773 HTTP/1.1" 200 107 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; YTB730; GTB7.2; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Media Center PC 6.0)"
212.42.46.113 - - [27/Dec/2016:18:00:23 +0000] "GET /item/electronics/2081 HTTP/1.1" 200 62 "/search/?c=Electronics+Music" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
152.36.45.138 - - [27/Dec/2016:18:00:23 +0000] "GET /category/computers HTTP/1.1" 200 122 "/item/software/2693" "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3"
216.102.51.188 - - [27/Dec/2016:18:00:23 +0000] "GET /category/software HTTP/1.1" 200 46 "/category/health" "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
212.45.213.191 - - [27/Dec/2016:18:00:23 +0000] "GET /category/books?from=20 HTTP/1.1" 200 104 "/search/?c=Books" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"


$ tail -n 5 access-log 
168.87.93.202 - - [27/Dec/2016:18:02:07 +0000] "GET /category/electronics?from=0 HTTP/1.1" 200 124 "/category/electronics" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; GTB6; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C)"
152.171.175.228 - - [27/Dec/2016:18:02:07 +0000] "GET /category/electronics HTTP/1.1" 200 108 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
20.180.31.115 - - [27/Dec/2016:18:02:07 +0000] "GET /item/networking/1688 HTTP/1.1" 200 66 "/search/?c=Networking+Music" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
188.102.156.179 - - [27/Dec/2016:18:02:07 +0000] "GET /category/software HTTP/1.1" 200 109 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
84.195.87.99 - - [27/Dec/2016:18:02:07 +0000] "GET /item/electronics/2151 HTTP/1.1" 200 44 "/item/finance/330" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"

では、これをLogstashで取り込んでElasticsearchに放り込んでみましょう。

pipelineを作成してみます。

$ sudo vim /etc/logstash/conf.d/pipeline.conf

中身は、こんな感じで。

input {
    file {
        path => "/tmp/access-log"
        start_position => "beginning"
    }
}

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
        break_on_match => false
    }
}

output {
    elasticsearch {
        hosts => ["elasticsearch:9200"]
    }
}

Input Pluginのfileで読み込み、Filter PluginのgrokでCommon Log Formatでパースし、
Output PluginでElasticsearchに放り込みます、と。

file | Logstash Reference [5.1] | Elastic

grok | Logstash Reference [5.1] | Elastic

elasticsearch | Logstash Reference [5.1] | Elastic

アクセスログは「/tmp/access-log」に置き、ファイルの先頭から読むようにしました。

ここまでできたら、Logstashを再起動。

$ sudo systemctl restart logstash.service

すると、Elasticsearchにアクセスログが入ります。

インデックスの一覧を見ると、「logstash-yyyy.mm.dd」なインデックスが増えました。

$ curl http://elasticsearch:9200/_cat/indices?v
health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   logstash-2016.12.27             D51a_dHSRU6H_c549O5_0w   5   1     100001            0     37.8mb         37.8mb
yellow open   .kibana                         u8X_mxW8TyCUZtu6XwiFfw   1   1          2            0     13.8kb         13.8kb
yellow open   .monitoring-data-2              iWUJpueMSECH6MhjuxFtqA   1   1          5            0      6.8kb          6.8kb
yellow open   .monitoring-es-2-2016.12.27     XFB22wXZTMKEzF97AHOjDg   1   1       7458          144      3.4mb          3.4mb
yellow open   .monitoring-kibana-2-2016.12.27 -NQRmB_0QKOHmFl5APAgKA   1   1       1472            0    420.3kb        420.3kb

カウントしてみます。

$ curl http://elasticsearch:9200/logstash-2016.12.27/_count
{"count":100001,"_shards":{"total":5,"successful":5,"failed":0}}

とりあえず最低限の設定ですが、OKそうです。

Kibanaで見ると、こんな感じになりました。