2019.08.14

Logstashの導入


本記事はElasticStack関連で、データ収集を行うソフトウェアであるLogstashを構築する記事です。
Logstashの使い方については、触りだけ記載しております。

Logstashとは?

Logstashは、Elastic社が提供するデータ収集ソフトウェアです。
様々な形式のデータを読み込み、加工し、様々な場所へデータの出力を行います。

ユースケースとしては、

  • 冗長化されているアプリケーションサーバーの出力ログを一か所にまとめる
  • ログを分析するために特定のソフトウェアへデータを加工して転送する

ようなものが考えられます。

null

役割が似たソフトウェアとしてFluentdがありますね。(私はFluentdの技術は持っていません!)

Logstashではinput filter outputの3つの設定を行い、パイプラインとして実行を行います。。

null

inputでは、データの取り込み元を設定します。
filterでは、取り込んだデータの加工を行います。 (filterの処理は任意です)
outputでは、取り込み・加工を終えたデータを出力する先を設定します。

inputおよびoutputでは、多彩なプラグインが用意されています。
これにより、入力としてs3などのAWSサービスやapacheなどのソフトウェアや特定の形式で作成されたファイルなどからデータの取り込み、Elasticserchをはじめとした各種サービスやファイルに自由に出力することが可能です。

Logstashのインストール方法

それでは、Logstashを実際にインストールしてみましょう。
Logstashはjava8以上の実行環境が必要になりますので、Javaのインストールを一緒に進めていきます。

想定する環境はAWSのAmazonLinux2のEC2インスタンスです。

RedHat系Linuxの場合 (yum)

インスタンス構築したての状態ではjava環境はないためインストールします。

java8のインストール

javaのjdkパッケージの検索を行います。

$ yum search java-1.8

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
=================================================================================== N/S matched: java-1.8 ===================================================================================
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment 8
java-1.8.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.8.0-openjdk-accessibility-debug.x86_64 : OpenJDK 8 accessibility connector for packages with debug on
java-1.8.0-openjdk-debug.x86_64 : OpenJDK Runtime Environment 8 with full debug on
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos 8
java-1.8.0-openjdk-demo-debug.x86_64 : OpenJDK Demos 8 with full debug on
・
・
・

対象のパッケージの存在したので、java1.8 openjdkのインストールを実行します。

$ sudo yum install java-1.8.0-openjdk -y

適切にインストールされているか確認
バージョン情報が出力されればOK!

$ java -version

openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)

Logstashのインストール

/etc/yum.repos.d/ 配下に logstash.repoを以下の内容で作成

7.x系の場合

logstash.repo
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

※7.xのx部分は変更しません

6.x系の場合

logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

※6.xのx部分は変更しません

ファイル作成後、以下コマンドでパッケージをインストールします。

$ sudo yum install logstash -y

インストール後、Logstashは以下フォルダへ配置されます。

・実行関連のファイル /usr/share/logstash/
・設定関連のファイル /etc/logstash/

Logstash動作確認

インストールできたら動作確認をしてみましょう
以下コマンドは、入力を標準入力にし、出力を標準出力にしてLogstashを実行するコマンドです。

$ cd /usr/share/logstash/
$ sudo bin/logstash -e 'input { stdin { } } output { stdout {} }'
・
・
・
[INFO ] 2019-08-09 07:06:08.050 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}

と表示され入力待ち状態になっていれば起動成功です。(起動には30秒ほどかかります)

標準入力に文字を入力すると、標準出力へJSON形式で表示されます。

> logstash-sample

/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
      "@version" => "1",
      "message" => "logstash-sample",
      "@timestamp" => 2019-08-09T07:08:12.120Z,
      "host" => "ip-10-0-10-25.ap-northeast-1.compute.internal"
}

「Cannot allocate memory」 のエラーが出た場合

Logstashの実行用のヒープ領域が足りない状態です。
デフォルト1gに設定されているため、t2.micro等の無料枠のEC2インスタンスを利用すると発生します。
/etc/logstash/jvm.optionを以下のように修正しましょう。(サイズは適宜調整してください)

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms300m
-Xmx300m

この状態で実行すればエラーが解消されます。

Logstashの設定ファイルを読み込んでの起動

上記では、コマンドラインにて起動設定を行いましたが、以降では設定ファイルに情報を記載して実行しましょう。

Logstashのinput filter outputの処理は、それぞれの処理を記載したconfファイルを作成して起動時に読み込むことで実施されます。

Logstash設定ファイルの書き方
input {
 ## inputの処理を書く
}

filter {
 ## filterの処理を書く(任意)
}

output {
 ## outputの処理を書く
}

という上記の形で設定ファイルを作成します。
前述の起動確認の場合は、以下のような設定で起動されていました。

起動確認時の設定
input { 
  ## 標準入力
  stdin { } 
}

## filterは無し

output { 
  ## 標準出力
  stdout {} 
}

/etc/logstash/配下にlogstash-sample.confというファイルがあるので内容を見てみましょう。

logstash-sample.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

ElasticStackのBeatsからElasticsearchへデータを転送するパイプラインが記載されています。
※AmazonElasticsearchServiceのElasticSearchでは上記プラグインでは接続できません。別記事 書いてますのでこちら参照してください。

プラグインを使うことで、上記のように必要最低限のみの記載を行いデータの転送を行うことができます。

プラグインの種類と使い方に関しては、たくさん種類があるので、ぜひ公式ドキュメントをご確認ください。
inputプラグイン
filterプラグイン
outputプラグイン

設定ファイルを読みこんで起動する場合は、-fオプションを使い、以下のように実行します。

$ cd /usr/share/logstash/
$ sudo bin/logstash -f "/etc/logstash/logstash-sample.conf"

「入力元のファイルが前回は読み込まれたのに、Logstashを再起動したらファイルが読みこまれない!」

Logstashは前回起動時の情報を保持しています。
そのため、ファイルに変更がなく再起動した場合出力は行われません。

テスト等で動作確認を行っていて複数回読み込みたい場合は、以下フォルダ配下の一時ファイルを削除します。

/usr/share/logstash/data/plugins/inputs/file

.sincedb_6f02b3b891cd27198ecd7d140a064240のような名前のファイルがあると思いますので削除すれば、再起動時に再度初めから読み込まれます。

「confファイルを変更した後の起動時間が長くて待つのがめんどくさい!」

Logstashの実行時に-rオプションをつけて実行しましょう。

$ sudo bin/logstash -f "/etc/logstash/logstash-sample.conf"

confファイルに変更が入る度に、再起動がかかるようになります。

最後に

今回の記事では、Logstashの基本情報とインストール方法を記載させていただきました。
各プラグインの利用方法がわかりやすく、非常に使い勝手のいいデータ収集ソフトウェアだと個人的に思いました。
それとElasticsearchを導入するのであれば、同じ会社が出しているソフトウェアを使いたくなってしまいます!

サーバーが冗長化構成で複数台ある現在のクラウトインフラ環境では、ログを集積し分析する必要があると思います。
そんな時に役に立つLogstashの利用をぜひ検討してみてください!

具体的な利用方法については記載しておりませんが、また機会があれば記事を書かせていただきます。

情報不足や誤りがありましたらコメントでご指摘いただければ幸いです。 ありがとうございました(#^.^#)

(参考)yum以外でのインストール手順

windowsの場合

Elastic公式からダウンロード

その他の場合

公式を参照してください。

aptの場合 mac/Homebrewの場合


<!-- Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com --><!-- License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) -->