fluentd + Chatworkでカジュアルにログ監視する
本記事はマイネット Advent Calendar4日目の記事です。
1日目に引き続き@takashabeがお送りします。
今回はfluentdを利用して開発環境やステージング環境のエラーログをChatworkに流す手法についてご紹介します。
背景
弊社では他社で開発した歴史あるソシャゲを引き取って運用するプロジェクトが多数あります。単純にログを見る用途だとSentryなどの専用ライブラリを使ったほうが高機能ですが、その場合アプリケーションの改修が発生するので導入コストが高い可能性があります。
一方fluentdでログを送るだけだと、(もし入っていなければ)fluentdをサーバに入れるだけなので導入と運用コストが低いというメリットがあります。
やること
Chatwork側のAPI準備
ChatworkのAPIは現状プレビューとなっており、以下から申請する必要があります。 http://developer.chatwork.com/ja/
申請後、数時間〜するとメールが届いてAPIが解放されます。その後以下に従ってtokenを発行して控えておきましょう。 http://developer.chatwork.com/ja/authenticate.html
fluentdインストール
fluentd自体をgemで入れてもいいですが、ここでは何かと便利なtd-agentを入れておきます。
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh # pluginの導入 $ td-agent-gem install fluent-plugin-out_chatwork fluent-plugin-rewrite-tag-filter
fluentd設定
td-agent.confに以下の様な感じで設定します。
ここではvirtualhostで2環境(dev-01,dev-02)作っているapacheのエラーログを流すことを想定しています。
## エラーログをtailして監視する
## formatで指定したマッチした文字列を後処理で利用する(<message>など)
<source>
type tail
format /^(?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])? \[client (?<client>[^\]]*)\] (?<message>.*)$/
pos_file /tmp/dev-01_error_log.pos
path /var/log/httpd/dev-01-error.log
tag dev-01.apache.error
</source>
<source>
type tail
format /^(?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])? \[client (?<client>[^\]]*)\] (?<message>.*)$/
pos_file /tmp/dev-02_error_log.pos
path /var/log/httpd/dev-02-error.log
tag dev-02.apache.error
</source>
## 例えば定常的に出てしまうログなど、特定のログを排除する。合ってもなくても良い
<match *.apache.error>
type rewrite_tag_filter
rewriterule1 message (<排除したい文字列>) ${tag}.clear
rewriterule2 message (.+) ${tag}.accept
</match>
## 上記のrewrite_tag_filterでacceptとなったログのみ処理する
## 数が増えてきたらforestでまとめるのも良いでしょう
<match dev-01.apache.error.accept>
type chatwork
api_token <API_TOKEN>
room_id <ROOM_ID>
message "[info][title](cracker) [dev-01] [<%= Time.at(time).strftime("%Y/%m/%d %H:%M:%S") %>] [<%= record['level'] %>] (cracker)[/title]<%= record['message'] %>[/info]"
</match>
<match dev-02.apache.error.accept>
type chatwork
api_token <API_TOKEN>
room_id <ROOM_ID>
message "[info][title](F) [dev-02] [<%= Time.at(time).strftime("%Y/%m/%d %H:%M:%S") %>] [<%= record['level'] %>] (F)[/title]<%= record['message'] %>[/info]"
</match>
ここまで設定して上手くログを流すことが出来れば以下のようにChatwork上にログが流れるでしょう。

まとめ
fluentdを利用してChatworkにログを流す方法について紹介しました。
ソシャゲ運用ではプランナーがマスタを入れて確認というフローが多いため、チャット上にログが流れることによってプランナーが単独でエラーを解消する、もしくはエンジニアに助けを求めるということがカジュアルに出来るようになり便利かと思います。
やってることは単純ですが他PJでも採用事例が増えており、こういったもので少しでも楽をしていきたいですね。