Logstashのインストールと簡単な設定方法
webサーバーやバッチサーバー、色々なサーバーに個別にログファイルが出力されていてチェックするだけでも大変なので、ログ収集ツールについて調べてみます。
Fluentd、Logstashあたりがが有名だと思いますが、今回はLogstashを試してみます。
Logstash
Debian 8へインストールしてみました。
インストール
ドキュメントを参考にLogstash 2.3をインストールします。
Installing Logstash
OpenJDK 7以上が必要なので、インストールします。
# apt-get install openjdk-7-jre
※OpenJDK 8を使用したい場合はこちら。
Debian 8(jessie)にOpenJDK 8をインストールする
1.7.0_111がインストールできました。
# java -version
java version "1.7.0_111"
OpenJDK Runtime Environment (IcedTea 2.6.7) (7u111-2.6.7-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)
次にLogstash本体のインストールですが、aptでインストールすることにしました。
PGPキーを追加してリポジトリを追加。
# wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add -
OK
# echo "deb https://packages.elastic.co/logstash/2.3/debian stable main" | tee -a /etc/apt/sources.list
deb https://packages.elastic.co/logstash/2.3/debian stable main
ここでapt-get updateを実行するとこんなエラーが発生しました。
# apt-get update
E: メソッドドライバ /usr/lib/apt/methods/https が見つかりません。
N: パッケージ apt-transport-https はインストールされていますか?
パッケージのURLにhttpsを使用する場合は、apt-transport-httpsが必要になるようです。
インストールしておきます。
# apt-get install apt-transport-https
改めて、apt-get updateとLogstashのインストールを行います。
# apt-get update
# apt-get install logstash
これでLogstashのインストールは完了です。
ドキュメントにある手順で動作確認してみます。
/opt/logstashにインストールされるので、以下のコマンドでサーバーを起動
# /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
こんな感じで起動しました。
# /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
Settings: Default pipeline workers: 2
Pipeline main started

hello worldと入力すると、hello worldとログに出力されます。
# /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
Settings: Default pipeline workers: 2
Pipeline main started
hello world
2016-08-07T04:34:41.506Z php5 hello world

Ctrl + Cでサーバーを終了しました。
設定ファイルの記載方法
aptでインストールした場合、起動用のスクリプトが配置されます。
/etc/init.d/logstash
内容を確認すると、設定ファイルは
/etc/logstash/conf.d/
に配置するのが作法でした。
先ほど手動で試したのと同じ内容の設定ファイルを記載してみます。
・/etc/logstash/conf.d/test.conf
- input {
- }
- output {
- }
設定ファイルのチェックはconfigtestで行えます。
# /etc/init.d/logstash configtest
Configuration OK
最初の設定ファイルのサンプルとして、
指定のログファイルを監視
行が追加されたら別のファイルに内容を出力する
ということをやってみます。
「指定のログファイルを監視」はinputのセクションに記載。
「行が追加されたら別のファイルに内容を出力する」はoutputのセクションに記載します。
・/etc/logstash/conf.d/test.conf
- input {
- file {
- path => "/var/dev/logstash/log-input"
- start_position => beginning
- }
- }
- output {
- file {
- path => "/var/dev/logstash/log-output"
- }
- }
監視対象のファイルを作成します。
出力先のフォルダにlogstashユーザーに対して書き込み権限がないとエラーになります。
# mkdir -p /var/dev/logstash
# chmod -R 777 /var/dev/logstash
# touch /var/dev/logstash/log-input
サービスを起動
# /etc/init.d/logstash start
適当に監視対象のファイルに行を追加します。
# echo 'test' >> /var/dev/logstash/log-input
すぐにはログファイルに出力されず、バッファリングされるようです。
結果を確認したい場合は、一旦サービスを停止すれば良さそうです。
# /etc/init.d/logstash stop
/var/dev/logstash/log-outputにこんな感じでログが出力されました。
※実際は1行
- {
- "message":"test",
- "@version":"1",
- "@timestamp":"2016-08-07T05:45:15.107Z",
- "path":"/var/dev/logstash/log-input",
- "host":"php5"
- }
プラグインの追加
データの保存先はElasticsearchを指定するのが王道のようですが、
MariaDBに作成したテーブルに結果を追加する方法を調べてみます。
デフォルトoutputプラグインにはJDBCドライバを使用するものは含まれていないようです。
Output plugins
このプラグインを追加でインストールし、使ってみます。
logstash-output-jdbc
プラグインの追加については、こちらを参考にしました。
Working with plugins
先にログを保存するテーブルをMariaDBに作成しておきます。
- CREATE table log (
- id int not null auto_increment primary key,
- host varchar(32) not null,
- timestamp datetime not null,
- message varchar(512) not null
- );
続いてLogstashの設定です。プラグインの追加コマンドを実行
# /opt/logstash/bin//logstash-plugin install logstash-output-jdbc
Validating logstash-output-jdbc
Installing logstash-output-jdbc
Installation successful
無事追加できました。
MariaDBのJDBCドライバをこちらからダウンロード。
※会員登録が必要です。
https://downloads.mariadb.org/connector-java/
mariadb-java-client-1.4.6.jarをダウンロードしました。
/opt/logstash/vendor/jar/jdbcというフォルダを作成し、そこに保存しておきます。
# mkdir -p /opt/logstash/vendor/jar/jdbc
# mv mariadb-java-client-1.4.6.jar /opt/logstash/vendor/jar/jdbc
こちらを参考に設定ファイルを編集します。
Example: MariaDB
- input {
- file {
- path => "/var/dev/logstash/log-input"
- start_position => beginning
- }
- }
- output {
- jdbc {
- connection_string => "jdbc:mariadb://localhost/sample?user=root&password=P@ssw0rd"
- statement => [ "INSERT INTO log (host, timestamp, message) VALUES(?, ?, ?)", "host", "@timestamp", "message" ]
- }
- }
設定ファイルを変更したら、logstashを再起動
# /etc/init.d/logstash restart
監視対象のファイルに1行追加します。
# echo 'test' >> /var/dev/logstash/log-input
ちゃんとログテーブルにレコードが作成されました。
MariaDB [sample]> select * from log;
+----+------+---------------------+---------+
| id | host | timestamp | message |
+----+------+---------------------+---------+
| 1 | php5 | 2016-08-07 07:05:28 | test |
+----+------+---------------------+---------+
1 row in set (0.00 sec)
データベース停止時の挙動
データベースに接続できなかった時どうなるのか気になったので、試してみます。
一旦データベースを停止。
# /etc/init.d/mysql stop
監視対象のファイルに行を追加します。
# echo 'test' >> /var/dev/logstash/log-input
# echo 'test' >> /var/dev/logstash/log-input
データベース起動
# /etc/init.d/mysql start
テーブルの内容を確認したところ、ちゃんとログが追記されていました。
MariaDB [sample]> select * from log;
+----+------+---------------------+---------+
| id | host | timestamp | message |
+----+------+---------------------+---------+
| 1 | php5 | 2016-08-07 07:05:28 | test |
| 2 | php5 | 2016-08-07 07:07:15 | test |
| 3 | php5 | 2016-08-07 07:07:15 | test |
+----+------+---------------------+---------+
3 rows in set (0.00 sec)
コメント