Logstash は、オープン ソースの中央ログ ファイル管理アプリケーションです。
複数のサーバー、複数のアプリケーションからログを収集し、それらのログを解析して、中央の場所に保存できます。保存したら、Web GUI を使用してログを検索し、ログをドリルダウンして、さまざまなレポートを生成できます。
このチュートリアルでは、logstash の基礎と、システムに logstash をインストールして構成する方法について知っておく必要があるすべてについて説明します。
1. Logstatsh バイナリをダウンロード
Logstash は、elasticsearch ファミリーの一部です。こちらのlogstash Webサイトからダウンロードしてください。これが機能するには、Java がマシンにインストールされている必要があることに注意してください。
または、curl を使用して Web サイトから直接ダウンロードします。
wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz tar zxvf logstash-1.4.2.tar.gz cd logstash-1.4.2
注:後で yum を使用して logstash をインストールします。ここでは、最初にバイナリを手動でダウンロードして、コマンド ラインからどのように動作するかを確認します。
2. Logstash コマンドラインでオプションを指定
テスト目的で、logstash の基本を理解するために、コマンド ラインからいくつかのことを簡単に確認してみましょう。
以下に示すように、コマンド ラインから logstash を実行します。プロンプトが表示されたら、入力として「hello world」と入力します。
# bin/logstash -e 'input { stdin { } } output { stdout {} }' hello world 2014-07-06T17:27:25.955+0000 base hello world
上記の出力では、1 行目は stdin を使用して入力した「hello world」です。
2 行目は、logstash が stdout を使用して表示した出力です。基本的に、stdin に入力した内容を吐き出すだけです。
-e コマンド ライン フラグを指定すると、Logstash はコマンド ラインから直接構成を受け入れることができることに注意してください。これは、繰り返しの間にファイルを編集する必要なく、構成をすばやくテストするのに非常に役立ちます。
3.コーデックを使用して出力形式を変更する
rubydebug コーデックは、ruby-awesome-print ライブラリを使用して Logstash イベント データを出力します。
そのため、「stdout」出力を再構成する (「コーデック」を追加する) ことで、Logstash の出力を変更できます。構成に入力、出力、フィルターを追加することで、さまざまな方法でログ データを操作して、クエリを実行するときに格納されたデータの柔軟性を最大限に高めることができます。
# bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }' hello world { "message" => "", "@version" => "1", "@timestamp" => "2014-07-06T17:40:48.775Z", "host" => "base" } { "message" => "hello world", "@version" => "1", "@timestamp" => "2014-07-06T17:40:48.776Z", "host" => "base" }
4.エラスティックサーチをダウンロード
Logstash がどのように機能するかを確認したので、もう 1 ステップ先に進みましょう。すべてのログの入力と出力を手動で渡すことができないことは明らかです。この問題を解決するには、Elasticsearch というソフトウェアをインストールする必要があります。
ここからelasticsearchをダウンロードしてください。
または、以下に示すように wget を使用します。
curl -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.0.tar.gz tar zxvf elasticsearch-1.4.0.tar.gz
以下に示すように、elasticsearch サービスを開始します。
cd elasticsearch-1.4.0/ ./bin/elasticsearch
注:このチュートリアルでは、Elasticsearch 1.4.0 で Logstash 1.4.2 を実行することを指定しています。 Logstash の各リリースには、ペアリングする Elasticsearch の推奨バージョンがあります。実行している Logstash のバージョンに基づいて、バージョンが一致していることを確認してください。
5.エラスティックサーチを確認
デフォルトでは、elasticsearch は 9200 ポートで実行されます。
テスト目的で、stdin から入力を取得しますが (前の例と同様)、出力は stdout に表示されません。代わりに、elasticsearch に移動します。
Elasticsearch を検証するには、次を実行します。入力を求められたら、以下のように「the geek stuff」と入力してください。
# bin/logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }' the geek stuff
stdout には出力が表示されないため、elasticsearch を確認する必要があります。
次の URL にアクセスしてください:
http://localhost:9200/_search?pretty
上記は、elasticsearch で利用可能なすべてのメッセージを表示します。上記の logstash コマンドで入力したメッセージが出力に表示されます。
{ "took" : 4, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 9, "max_score" : 1.0, "hits" : [ { "_index" : "logstash-2014.07.06", "_type" : "logs", "_id" : "G3uZPQCMQ6ed4joNCuseew", "_score" : 1.0, "_source" : {"message":"the geek stuff","@version":"1","@timestamp":"2014-07-06T18:09:46.612Z","host":"base"} } ] }
6. Logstash の入力、出力、およびコーデック
入力、出力、コーデック、およびフィルターは、Logstash 構成の中心です。イベント処理のパイプラインを作成することにより、Logstash はログから関連データを抽出し、elasticsearch で利用できるようにして、データを効率的にクエリすることができます。
以下は、使用可能な入力の一部です。入力は、ログ データを Logstash に渡すためのメカニズムです
- file:UNIX コマンドの「tail -0a」と同じように、ファイルシステム上のファイルから読み取ります
- syslog:ウェルノウン ポート 514 で syslog メッセージをリッスンし、RFC3164 形式に従って解析します
- redis:redis チャネルと redis リストの両方を使用して、redis サーバーから読み取ります。 Redis は、リモート Logstash の「シッパー」からの Logstash イベントをキューに入れる、一元化された Logstash インストールの「ブローカー」としてよく使用されます。
- lumberjack:lumberjack プロトコルで送信されたイベントを処理します。現在は logstash-forwarder と呼ばれています。
以下はフィルターの一部です。フィルターは、Logstash チェーンの中間処理デバイスとして使用されます。イベントが特定の基準に一致する場合に、イベントに対して特定のアクションを実行するために、これらは条件と組み合わされることがよくあります。
- grok:任意のテキストを解析して構造化します。 Grok は現在、Logstash で非構造化ログ データを構造化されクエリ可能なものに解析するための最良の方法です。 Logstash には 120 のパターンが組み込まれて出荷されているため、ニーズに合ったパターンが見つかる可能性が高くなります!
- mutate:mutate フィルターを使用すると、フィールドに対して一般的な変更を行うことができます。イベントのフィールドの名前変更、削除、置換、変更を行うことができます。
- ドロップ:デバッグ イベントなどのイベントを完全にドロップします。
- クローン:イベントのコピーを作成し、場合によってはフィールドを追加または削除します。
- geoip:IP アドレスの地理的位置に関する情報を追加します (そして、kibana で素晴らしいグラフを表示します)
以下はコーデックの一部です。出力は、Logstash パイプラインの最終フェーズです。イベントは処理中に複数の出力を通過する場合がありますが、すべての出力が完了すると、イベントは実行を終了します。
- elasticsearch:効率的で便利で簡単にクエリ可能な形式でデータを保存する場合
- file:イベント データをディスク上のファイルに書き込みます。
- グラファイト:イベント データをグラファイトに送信します。グラファイトは、メトリクスを保存およびグラフ化するための一般的なオープン ソース ツールです
- statsd:「UDP 経由で送信されたカウンターやタイマーなどの統計をリッスンし、1 つ以上のプラガブル バックエンド サービスに集計を送信する」サービス
7. Logstash 構成ファイルを使用
ここで、コマンド ライン オプションから構成ファイルに移動します。コマンド ラインでオプションを指定する代わりに、以下に示すように .conf ファイルでオプションを指定できます。
# vi logstash-simple.conf input { stdin { } } output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
次に、logstast に、以下のように -f オプションを使用して作成したばかりの構成ファイルを読み取るように依頼します。テスト目的で、これはまだ stdin と stdout を使用しています。したがって、このコマンドを入力した後にメッセージを入力してください。
# bin/logstash -f logstash-simple.conf This is Vadiraj { "message" => "This is Vadiraj", "@version" => "1", "@timestamp" => "2014-11-07T04:59:20.959Z", "host" => "base.thegeekstuff.com" }
8.入力 Apache ログ メッセージを解析する
では、もう少し高度な構成を行いましょう。 logstash-simple.conf ファイルからすべてのエントリを削除し、次の行を追加します。
# vi logstash-simple.conf input { stdin { } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
ここで、次に示すように logstash コマンドを実行します。
# bin/logstash -f logstash-filter.conf
ただし、今回は、次のサンプル Apache ログ ファイル エントリを入力として貼り付けます。
# bin/logstash -f logstash-filter.conf "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0""
logstatsh からの出力は次のようになります:
{ "message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/status.php HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"", "@version" => "1", "@timestamp" => "2013-12-11T08:01:45.000Z", "host" => "base.tgs.com", "clientip" => "127.0.0.1", "ident" => "-", "auth" => "-", "timestamp" => "11/Dec/2013:00:01:45 -0800", "verb" => "GET", "request" => "/xampp/status.php", "httpversion" => "1.1", "response" => "200", "bytes" => "3891", "referrer" => "\"http://cadenza/xampp/navi.php\"", "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"" }
上記の出力からわかるように、入力はそれに応じて解析され、すべての値が分割され、対応するフィールドに格納されます。
grok フィルターは apache ログを抽出し、有用なビットに分割したので、後でクエリを実行できます。
9. Apache エラー ログの Logstash 構成ファイル
Apache error_log ファイル用に次の logstash 構成ファイルを作成します。
# vi logstash-apache.conf input { file { path => "/var/log/httpd/error_log" start_position => beginning } } filter { if [path] =~ "error" { mutate { replace => { "type" => "apache_error" } } grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
上記の構成ファイルでは:
- 入力ファイルは /var/log/httpd/error_log で、開始位置はファイルの先頭になります。
- 入力ファイルをフィルタリングし、エラーのあるものはすべて apache_error に名前変更 (mutate) します。 grok はメッセージ列に結合された apachelog を作成し、データは指定された形式でタイムスタンプを表示します。
- 出力はローカルホストのelasticsearchに保存され、コーデック=> rubydebugを使用してルビー印刷形式でstdout経由でエコーされます
10. Apache エラー ログとアクセス ログの両方の Logstash 構成ファイル
以下に示すように、*_log を使用してすべてのログ ファイルを読み取るワイルドカード チャーターを指定できます。
ただし、以下に示すように、アクセス ログとエラー ログの両方を解析するには、それに応じて条件を変更する必要もあります。
# vi logstash-apache.conf input { file { path => "/var/log/httpd/*_log" } } filter { if [path] =~ "access" { mutate { replace => { type => "apache_access" } } grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } } else if [path] =~ "error" { mutate { replace => { type => "apache_error" } } } else { mutate { replace => { type => "random_logs" } } } } output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
11.追加の Yum リポジトリをセットアップする
テストは終了しました。これで、Logstash が Elasticseach とどのように連携するかがわかりました。
以下をインストールします:
- logstash – 中央ログ サーバー
- Elasticsearch – ログを保存するため
- Redis – フィルタ用
- Nginx – Kibana を実行するには
- Kibana – 美しい GUI ダッシュボードで、すべてをまとめます
インストールする前に、次のリポジトリをセットアップしてください:
# cd /etc/yum.repos.d/ # vi /etc/yum.repos.d/logstash.repo [logstash] name=Logstash baseurl=http://packages.elasticsearch.org/logstash/1.4/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1 # vi /etc/yum.repos.d/elasticsearch.repo [elasticsearch] name=Elasticsearch baseurl=http://packages.elasticsearch.org/elasticsearch/1.4/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1
また、前述のように EPEL リポジトリをセットアップします。
12. Elasticsearch、Nginx、Redis、および Logstash をインストールします
最初にシステムを最新の状態にしてから、以下に示すように、logstash を Elasticsearch、redis、および nginx とともにインストールします。
yum clean all yum update -y yum install -y install elasticsearch redis nginx logstash
13. Kibana をインストール
以下に示すように、ダッシュボードに Kibana をインストールします。
cd /opt/ wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.2.tar.gz tar -xvzf kibana-3.1.2.tar.gz mv kibana-3.1.2 /usr/share/kibana3
14. Kibana の構成
キバナにelasticsearchについて伝える必要があります。このために、次の config.js を変更します。
# vi /usr/share/kibana3/config.js elasticsearch: "http://log.thegeekstuff.com:9200"
上記のファイル内で、elasticsearch を検索し、その行の「dev.kanbier.lan」を自分のドメインに変更します (例:log.thegeekstuff.com)
15. Nginx から実行するように Kibana をセットアップ
また、nginx Web サーバーから実行するキバナを作成する必要があります。
nginx.conf に以下を追加
server { listen *:80 ; server_name log.thegeekstuff.com; access_log /var/log/nginx/kibana.myhost.org.access.log; location / { root /usr/share/kibana3; index index.html index.htm; }
また、サーバーの適切な IP アドレスを redis.conf ファイルに設定することを忘れないでください。
16. Logstash 構成ファイルの構成
ここで、前に使用した構成ファイルの例と同様の logstash 構成ファイルを作成する必要があります。
リモート ログを受信するポートと、logstash に elasticsearch ツールについて通知するログ ファイル パスを定義します。
# vi /etc/logstash/conf.d/logstash.conf input { file { type => "syslogpath => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog" ] sincedb_path => "/opt/logstash/sincedb-access" } redis { host => "10.37.129.8" type => "redis-input" data_type => "list" key => "logstash" } syslog { type => "syslog" port => "5544" } } filter { grok { type => "syslog" match => [ "message", "%{SYSLOGBASE2}" ] add_tag => [ "syslog", "grokked" ] } } output { elasticsearch { host => "log.thegeekstuff.com" } }"
17. Logstash、Elasticsearch、Redis、および Nginx を確認して開始
以下に示すように、これらすべてのサービスを開始します。
service elasticsearch start service logstash start service nginx start service redis start
18. Logstash Web GUI の確認
ブラウザーを開き、上記の構成ファイルで使用されているサーバー名 (ホスト) に移動します。例:log.thegeekstuff.com
次のようなグラフが表示されます。ここから、logstash によって収集されたすべてのログ ファイルを操作、参照、ドリルダウンできます。
ログ サーバーの準備が整ったので、rsyslog.conf ファイルを変更して、rsyslog によって管理されるリモート サーバー ログ ファイルをこの中央サーバーに転送する必要があります。