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でも採用事例が増えており、こういったもので少しでも楽をしていきたいですね。