ハウテレビジョン開発者ブログスマートフォン用の表示で見るハウテレビジョン開発者ブログ『外資就活ドットコム』を日夜開発している技術陣がプログラミングネタ・業務改善ネタ・よしなしごとについて記していきます。2014-08-07fluentdでnginxのログをElasticsearchとBigQueryに保存するお話こんにちは。地元のおっさん人生の大先輩の絡み酒に付き合わされた祖山です。取り組んでいますが、最近の大きな案件としては、アクセスログ解析基盤の整備がありました。その際に一番のキモとなるのは、みんな大好きfluentdです。今回は、我々ハウテレビジョンがどのようにアクセスログを収集、保存しているのかについて、fluentdの設定を中心にご紹介します。現在の我々のサービス環境を考慮すると、アクセスログの収集には下記2つの目的が存在します。時間、IPアドレス、パスなどで目的のログをすぐに探し出し、調査を容易にしたいどのツール、サービスを使うのか1の目的を達成するためのツール、サービスは複数考えられますが、価格、性能の両面を考慮するとやはりBigQeuryが圧倒的です。非常に安価かつ高速にログを蓄積、検索できます。クラウドサービスのため運用工数が抑えられることも大きなメリットです。BigQueryはクエリを発行する度に課金されるため、探索的、アドホックな検索には向いていません。そのため2の目的にBigQueryを用いることは不適切です。Kibanaを自らインストールして運用しても、さほど運用工数はかからないでしょう。Kibanaを採用しました。やっているのか一応お絵かきしてみたものの、わざわざ図にするまでもないシンプルな構成です。Webサーバ(nginx)からfluentdで直接それぞれにログを送っています。Webサーバ1台で運用しているため、仲介サーバは設けていません。各種ツール個別のセットアップ方法については既存の情報が豊富なため、ここでは省略します。fluentdとElasticsearchあるいはBigQueryの連携についても探せばたくさん見つかるでしょう。fluentdからログを単純に流すだけであれば、困難に突き当たることはないでしょう。我々の要件や、各ツール、サービスの使用上の制約から、気をつけなければならない点がいくつかあります。これらを上手く組み合わせることで全て実現が可能です。それではお待ちかね、我々が使っているtd-agent.confをここで公開します。</case></match>順を追って解説していきます。nginx.access</source>sourceディレクティブについては特に説明する必要はないでしょう。標準のtailプラグインでnginxのログをトラックしてnginx.accessというタグを付与するだけです。${tag}.accept</match>1つ目のmatchディレクティブでは、ログのフィルタリングを行っています。fluent-plugin-rewrite-tag-filterという、正規表現をもとにタグを付け替えられるプラグインを使います。その他(ユーザーの行動に関係のあるログ)の場合にはacceptを追加します。除外するログはnginx.access.clearとなって次のmatchに渡されます。${tag}.${time.strftime('%Y%m')}</match>先に挙げた理由から、BigQueryの保存先テーブルを月毎に変化させる必要があります。2014年8月のログなら保存先テーブルはnginx_201408、9月ならnginx_201409といった次第です。いうプラグインを使います。上記のようにenable_rubyをtrueにセットすると、任意のRubyのコードを使うことができます。nginx.access.accept.201408とタグを書き換えることができます。して末尾に付与した年月によって、次のmatchディレクティブで保存するテーブルを変えていきます。nginx.access.accept>としているため、BigQueryから除外するログ(nginx.access.clear)についてはここでは処理が行われません。</case></match>ようやく最後のmatchディレクティブに来ました。ここではすべてのログをElasticsearchに流すタグにacceptがついたログだけはBigQueryに流すタグの末尾の値(201408など)に応じて、BigQueryの保存先テーブルを変化させるという、少々複雑な操作が必要となります。複数の宛先へログを送るには、標準のcopyプラグインを使います。タグの値によって動的に保存先テーブルを変化させるのには、fluent-plugin-forestを利用します。</template>templateセクションにはマッチした全てのログに対する共通の処理を記述します。Elasticsearchには全てのログを保存しておきたいため、ここにはElasiticsearchに保存する処理を記述します。</case>caseセクションは一般的なプログラミング言語のswitch-case文と同じく、その条件にマッチするログに対してのみ行う処理を記述します。(nginx.accessの部分はremove_prefixで除去済みです)。service_nginx_${tag_parts[-1]}最後に、この部分がキモとなります。${tag_parts[-1]}とすることで、タグの末尾(accept.201408なら201408)の値を埋め込むことができます。9月のログならばnginx_201409のテーブルといった次第に格納先のテーブルを変化させることができるのです。まとめ以上、fluentdを使ってnginxのログをElasticsearchとBigQueryに保存する方法についてご紹介しました。使えば使うほど、その柔軟性、設定の容易さ、エコシステムの広さに驚嘆するばかりです。おかげでログを収集、保存することが容易になった一方で、ただ貯めておくだけでは何の価値も生み出しません。我々の解析基盤は出来たてのホヤホヤであり、これからどんどんデータが蓄積されていきます。ある程度データが溜まった段階で様々な施策に活かしていきますので、その過程や結果について、またここでご紹介できればと思います。Botを作るこんにちは、Go2のReleaseを楽しみにしているymgytです。dayとして、業務と直...2014-09-05nginxのアクセスログにユーザーIDを記録する方法こんにちは。来週末のPyConが待ち遠しくてたまらない祖山です。はてなブログPro『外資就活ドットコム』の開発チームです。技術ネタ・プログラミングネタ等々書いていきます。業務未経験からエンジニアになって半年を振り返るDocker初心者がRails+MySQLの環境構築をDockerでやってみた月別アーカイブ検索はてなブログをはじめよう!howtvさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。