【Hinemos】アプリケーションログをfluentdで転送する

去る4月22日、Hinemos ver4.0.2がめでたくリリースされました。ver4.0.1から数多くの改善や不具合解消が行われていますので、できるだけバージョンアップしたいところです。

さて、Hinemos ver4.0では、アプリケーションログの監視方法がver3.2から変わっています。具体的には、

  • ver3.2…監視対象ノード上のログ転送エージェントが、ログ増分をsyslogプロトコルで転送し、マネージャ側でマッチング
  • ver4.0…監視対象ノード上のエージェントがログ増分のマッチングを行い、マッチしたものだけをマネージャへ伝達

という処理になっています。これにより、マネージャの負荷を軽減しているわけですが、「監視と同時にマネージャサーバへログを転送し、マネージャサーバ上でログを保存したい」という場合には、このver4.0の方式では不都合が生じてきます。

この状況に対応するために、今回は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でダウンロードしてシェルへ渡すだけで、そのままインストールすることができます(とても簡単です)。

# curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh
...
Complete!

インストールが完了したら、とりあえず両サーバとも起動してみます。サービス名はtd-agentです。

# service td-agent start
Starting td-agent:                                         [  OK  ]

簡単に動作確認してみます。fluentdのデフォルトの設定では、HTTP(8888)でログメッセージを待ち受けして、受信した内容を自身のログファイル(/var/log/td-agent/td-agent.log)へ出力するようになっています。上記のドキュメントに従って、以下のコマンドを実行します。

# curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

早速、ログファイルを確認してみます。

# 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の設定変更を行います。
設定内容は次のとおりです。

[転送元(エージェント)サーバ]
# 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が転送対象のログファイルを読み取ることができるよう、権限を設定しておく必要があります。

[転送元(エージェント)サーバ]
# chmod o+rx /var/log/httpd
# service td-agent restart
...

[転送先(マネージャ)サーバ]
# service td-agent restart
...

これで、準備は完了です。転送元サーバのhttpdを再起動し、Hinemosでログが検知されるとともに、ログが転送先サーバへ転送されるかどうかを確認します。

[転送元(エージェント)サーバ]
# service httpd restart
...

まず、Hinemosで検知されたことを確認します。

ログファイル監視の動作確認(その2)

ログファイル監視の動作確認(その2)

通常どおり、Hinemosで検知されました。次に、転送先サーバへログが転送されたかどうかを確認します。

# 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.*というファイルが作成されています。これが、受信したログを出力したファイルだと思われます。中身を確認してみます。

# 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に関する話題を簡単にご紹介しました。

3 Comments

  1. 生ログのまま保存したければfluent-agent-liteとfile-alternativeがありますよ(これ誰が書いてるんだろうw / “Hinemos 研究日記 » Blog Archive » 【Hinemos】アプリケー…” | shunword BLOG より:

    […] http://atomitech.jp/hinemos/blog/?p=1334 tagomoris tagomoris 生ログのまま保存したければfluent-agent-liteとfile-alternativeがありますよ(これ誰が書いてるんだろうw / “Hinemos 研究日記 » Blog Archiv […]

  2. fujita より:

    コメントありがとうございました。ご教示頂いたfluent-agent-lite、もしくはfile-alternativeプラグインを試してみたいと思います。取り急ぎ、記事のうちご指摘頂いた箇所を修正しました。

Leave a Reply

You must be logged in to post a comment.