はじめに
td-agentを使ってみてから結構経ちました。
だんだん記憶から消えていきそうな自分の脳みそのために本番サービスに入れてみた時にやったことをメモっておくメモです
前回はこちら
→td-agent(fluentd)を本番サービスで小さく使ってみたメモ①-dev、ステージング、本番でconfig分けたい
今回は出力するログについて
前置き
fluentdやtd-agent関連のエントリーではin_tailプラグイン×accessログに関するエントリーが多いです。
そこから読み取れる情報は多いですが、さらによりフレキシブルな形で行動ログ的なものを取りたい場合も多いです
そんなとき、WAFもしくは自前でjson形式のログを吐く仕組みを用意し、
td-agent(fluentd)でtailしてmongodbやhadoopなんかに入れるようにしてみましたっていう感じのメモになります
今考えるとああしておけばよかったなーと思う所も多々ありますが
恥をさらしてでも今後の自分のためにもそのまま晒します( ;)
要件
今となってはうる覚えですが、
td-agentと行動ログの仕組みを導入時した際はこんな要件でした
- 前提
- ユーザサポート調査のログになるような仕組みにもしたい
- 機能によってログ出力のレベル①~③を切り替えたい
- ①何もしない
- ②テキストログのみ出力(web側に)
- ③fluentdでtailする(mongodbまで入れる)
- webサーバ
- ログサーバ側が死んでも最悪スクリプトとかで復帰できるようにテキストも残しておきたい
- ログサーバ
- 分析用にmongodbやhadoopにデータ入れたい
- バグ調査用にも各webのログがマージされたテキストとしても出力したい
- 調査しやすいように開発の機能分担ごとに各機能ごとのログを分けておきたい
- 過去ログ、締めたログは消せる(退避できる)ように、ある単位でセグメントしたい(月ごとetc...)
構成
説明は後述しますが、要件を受けてこんな感じの構成にしました
※このエントリーに関するプラグインのみにしてます
やったこと
前回のエントリに加えて、この要件を満たすために主にこんな感じで用意していきました
- 行動ログ出すphp作る
- td-agentのconfigまわり整える
- dir構成考える&dir作成shつくる
- config書く
- シンボリックリンク作成shとcronつくる
- td-agentのプラグイン入れる
ってことで
1.行動ログ出すphp作る
ここでは前提①や②の要件を満たすようにphpスクリプトを用意しました
エントリ用のかなりざっくりしたコードですが載せときます
イメージ的にconfigの値で下記を切り替えられるようするのがメインな感じです
- 何もしない
- ローカル(web)にテキストログ出す
- forwardする ※forwardされたらテキストにもmongoにも残る
また、機能単位、日時でファイルを分けます
コード
ささっと書いたらかなりキタナイ&適当になってしまいました(><)
が、githubにもあげてみました
https://github.com/tweeeety/php-actionlog
2. td-agentのconfigまわり整える
configまわりの整備ってことでこんな感じのことをしました
- dir構成考える&dir作成shつくる
- config書く
- シンボリックリンク作成shとcronつくる
※ここで出てきたconfigやソース類のサンプルもせっかくなのでまとめてgithubにおきました https://github.com/tweeeety/fluentd-preparation-sample
dir構成考える&dir作成shつくる
送信側、受信側、dev、stg、prd環境や新しく追加するサーバで
ディレクトリの構成を同じにしたかったので
/var/log/td-agent
直下に{project}名のディレクトリをつくり、
そこにもろもろ格納することにしました
こんな感じ
# pwd /var/log/td-agent # tree ./project project |-- aclog |-- buffer |-- out |-- pos `-- slink
そして各環境で叩くだけでよいようにshにしておきました
config書く
tailしてout_forward
↓
in_forwardしてfileとmongo
って流れをシンプルにこんな感じにしてみました
送信側(web)
受信側(集約とかログサーバ)
シンボリックリンク作成shとcronつくる
日付入りログファイルをtailするので
cronでシンボリックリンクを作成&更新するよう毎日0時0分で登録しておきました
行動ログの種類分ファイルができる想定だったので
行動ログの種類(ファイル名)をどっかに定義しておきました。
ここではサンプル的にテキストファイルに定義しておいた体です。
また、複数ファイルのtailなんかについての詳細はこちらにまとめました
→td-agent(fluentd)で日付指定のログをtailする①-シンボリックリンクでやる
→td-agent(fluentd)で日付指定のログをtailする②-tail_exプラグインでやる
→td-agent(fluentd)でのtail_exの挙動メモ(エラーになったり動かなかったりするパターンに気をつけましょう!)
3. td-agentのプラグイン入れる
あとは単純にプラグイン入れるだけです
web
# sudo /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-tail-ex
logとか集約サーバ
# sudo /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-mongo # sudo /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-forest
ってことで
って感じでかなりキタナイ&まとまりのない記事になってしまいましたが
せっかくなのでメモっておきました\(^o^)/