【Hinemos】アプリケーションログをfluentdで転送する
投稿日: / 更新日:
今回はfluentdを使用して、アプリケーションログをマネージャへ転送するよう設定してみます。
1. fluentdのインストールと動作確認
fluentdはオープンソースのログ収集基盤ミドルウェアで、ログをJSONストリームとして転送、受信するという大きな特徴があります。またログの入出力や加工は、目的にあったプラグインを使用して行います。プラグインは標準でいくつか用意されているほか、公式サイトのプラグインディレクトリに多数公開されており、簡単に機能を追加することができます。
今回は、Hinemos ver4.0.2のエージェントサーバ上で監視しているアプリケーションログを、fluentdを使用してマネージャサーバへ転送し、マネージャサーバ上で保存するよう設定してみたいと思います。
まず、マネージャ、エージェントの両サーバ上で、fluentdインストール前の環境設定を行います。詳細は、fluendt公式サイトのBefore Installing Fluentdというドキュメントに記載されていますので、これに従って実施します。
次に、fluentdをインストールします。Red Hat Enterprise Linux 6.xの場合、Treasure Data社のサイトで公開されているシェルスクリプトをcurlでダウンロードしてシェルへ渡すだけで、そのままインストールすることができます(とても簡単です)。
1 2 3 |
# curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh ... Complete! |
インストールが完了したら、とりあえず両サーバとも起動してみます。サービス名はtd-agentです。
1 2 |
# service td-agent start Starting td-agent: [ OK ] |
1
簡単に動作確認してみます。fluentdのデフォルトの設定では、HTTP(8888)でログメッセージを待ち受けして、受信した内容を自身のログファイル(/var/log/td-agent/td-agent.log)へ出力するようになっています。上記のドキュメントに従って、以下のコマンドを実行します。
1 |
# curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test |
早速、ログファイルを確認してみます。
1 2 3 |
# tail /var/log/td-agent/td-agent.log ... 2013-05-12 13:46:25 +0900 debug.test: {"json":"message"} |
期待どおり、ログが出力されていることが確認できました。
2. Hinemosによる、アプリケーションログの監視設定
ここでは、あらかじめエージェントサーバ上にインストールしたhttpdのエラーログ(/var/log/httpd/error_log)を、Hinemosで監視するよう設定します。便宜上、httpdがシャットダウンしたことを示すログ(caught SIGTERM, shutting down)が出力された場合に、危険のイベントを通知するようにしています。
設定できたら、httpdを再起動して、ログが検知されることを確認します。
期待どおり、エラーログがHinemosで監視されていることが確認できました。
3. fluentdでアプリケーションログを転送する
次は、ログ転送元、転送先両サーバでfluentdの設定変更を行います。
設定内容は次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
[転送元(エージェント)サーバ] # vi /etc/td-agent/td-agent.conf (デフォルトの設定を全てコメントアウトし、以下を追加) # forwarding httpd error_log <source> type tail format /^\[(?<time>[\w: ]+)\] \[(?<level>\w+)\] (?<message>.+)$/ time_format %a %b %d %H:%M:%S %Y path /var/log/httpd/error_log pos_file /var/log/td-agent/httpd-error_log.pos tag httpd.error </source> <match httpd.error> type forward <server> host 192.168.XXX.XXX ※転送先(マネージャ)サーバのIPアドレス </server> </match> [転送先(マネージャ)サーバ] # vi /etc/td-agent/td-agent.conf (デフォルトの設定を全てコメントアウトし、以下を追加) # output received httpd error_log <source> type forward </source> <match httpd.error> type copy <store> type file path /var/log/td-agent/httpd_error.log time_slice_format %Y%m%d time_format %F %T </store> </match> |
設定ファイルを編集した後は、両サーバともtd-agentを再起動すれば設定が反映されますが、その前に転送元サーバ(エージェントサーバ)において、td-agentが転送対象のログファイルを読み取ることができるよう、権限を設定しておく必要があります。
1 2 3 4 5 6 7 8 |
[転送元(エージェント)サーバ] # chmod o+rx /var/log/httpd # service td-agent restart ... [転送先(マネージャ)サーバ] # service td-agent restart ... |
これで、準備は完了です。転送元サーバのhttpdを再起動し、Hinemosでログが検知されるとともに、ログが転送先サーバへ転送されるかどうかを確認します。
1 2 3 |
[転送元(エージェント)サーバ] # service httpd restart ... |
まず、Hinemosで検知されたことを確認します。
通常どおり、Hinemosで検知されました。次に、転送先サーバへログが転送されたかどうかを確認します。
1 2 3 4 5 6 7 |
# ls -alh /var/log/td-agent/ 合計 40K drwxr-xr-x 3 td-agent td-agent 4.0K 5月 12 16:51 2013 . drwxr-xr-x. 11 root root 4.0K 5月 12 14:36 2013 .. drwxrwxrwx 2 td-agent td-agent 4.0K 5月 12 13:38 2013 buffer -rw-rw-rw- 1 td-agent td-agent 535 5月 12 16:50 2013 httpd_error.log.20130512.b4dc80a79092929d5 -rw-r--r-- 1 td-agent td-agent 18K 5月 12 16:50 2013 td-agent.log |
httpd_error.log.*
というファイルが作成されています。これが、受信したログを出力したファイルだと思われます。中身を確認してみます。
1 2 3 4 5 6 |
# cat /var/log/td-agent/httpd_error.log.20130512.b4dc80a79092929d5 2013-05-12 16:50:22 httpd.error {"level":"notice","message":"caught SIGTERM, shutting down"} 2013-05-12 16:50:22 httpd.error {"level":"notice","message":"suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)"} 2013-05-12 16:50:22 httpd.error {"level":"notice","message":"Digest: generating secret for digest authentication ..."} 2013-05-12 16:50:22 httpd.error {"level":"notice","message":"Digest: done"} 2013-05-12 16:50:22 httpd.error {"level":"notice","message":"Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations"} |
フォーマットが多少異なりますが、確かにhttpd再起動時のログのようです。できれば、出力形式をオリジナルと同様にしたいところですが、今回、それを実現するための方法を見つけることができませんでした。どうやら、デフォルトのout_fileでは、そのための設定方法が用意されていないようです(fluent-agent-lite、もしくはfile-alternativeプラグインを使用することで、未加工のログのまま転送できるようです。追って検証したいと思います)。プラグインはRubyで簡単に記述することができるようです。機会があれば、その方法も検討してみたいと思います。
以上、中途半端な内容になってしまいましたが、fluentdに関する話題を簡単にご紹介しました。