読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

td-agent(fluentd)を本番サービスで小さく使ってみたメモ②-accessログの他に任意のログをjson出力したときメモ

はじめに

td-agentを使ってみてから結構経ちました。
だんだん記憶から消えていきそうな自分の脳みそのために本番サービスに入れてみた時にやったことをメモっておくメモです
前回はこちら
td-agent(fluentd)を本番サービスで小さく使ってみたメモ①-dev、ステージング、本番でconfig分けたい

今回は出力するログについて

前置き

fluentdやtd-agent関連のエントリーではin_tailプラグイン×accessログに関するエントリーが多いです。
そこから読み取れる情報は多いですが、さらによりフレキシブルな形で行動ログ的なものを取りたい場合も多いです
そんなとき、WAFもしくは自前でjson形式のログを吐く仕組みを用意し、
td-agent(fluentd)でtailしてmongodbやhadoopなんかに入れるようにしてみましたっていう感じのメモになります

今考えるとああしておけばよかったなーと思う所も多々ありますが
恥をさらしてでも今後の自分のためにもそのまま晒します( ;)

要件

今となってはうる覚えですが、
td-agentと行動ログの仕組みを導入時した際はこんな要件でした

  • 前提
    1. ユーザサポート調査のログになるような仕組みにもしたい
    2. 機能によってログ出力のレベル①~③を切り替えたい
      • ①何もしない
      • ②テキストログのみ出力(web側に)
      • ③fluentdでtailする(mongodbまで入れる)
  • webサーバ
    1. ログサーバ側が死んでも最悪スクリプトとかで復帰できるようにテキストも残しておきたい
  • ログサーバ
    1. 分析用にmongodbやhadoopにデータ入れたい
    2. バグ調査用にも各webのログがマージされたテキストとしても出力したい
    3. 調査しやすいように開発の機能分担ごとに各機能ごとのログを分けておきたい
    4. 過去ログ、締めたログは消せる(退避できる)ように、ある単位でセグメントしたい(月ごとetc...)

構成

説明は後述しますが、要件を受けてこんな感じの構成にしました
※このエントリーに関するプラグインのみにしてます

f:id:tweeeety:20140521220836p:plain

やったこと

前回のエントリに加えて、この要件を満たすために主にこんな感じで用意していきました

  1. 行動ログ出すphp作る
  2. td-agentのconfigまわり整える
  3. td-agentのプラグイン入れる

ってことで

1.行動ログ出すphp作る

ここでは前提①や②の要件を満たすようにphpスクリプトを用意しました
エントリ用のかなりざっくりしたコードですが載せときます
イメージ的にconfigの値で下記を切り替えられるようするのがメインな感じです

  • 何もしない
  • ローカル(web)にテキストログ出す
  • forwardする ※forwardされたらテキストにもmongoにも残る

また、機能単位、日時でファイルを分けます

コード

ささっと書いたらかなりキタナイ&適当になってしまいました(><)
が、githubにもあげてみました
https://github.com/tweeeety/php-actionlog

2. td-agentのconfigまわり整える

configまわりの整備ってことでこんな感じのことをしました

※ここで出てきた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^)/