share facebook facebook2 twitter menu hatena pocket slack

2015.02.09 MON

ELB からのヘルスチェックアクセスで出力されるアクセスログを fluentd で良しなに振り分けるメモ

川原 洋平

WRITTEN BY川原 洋平

ども、cloudpackかっぱ (@inokara) です。

はじめに

Elastic Load Balancing(以下、ELB) に限らず Proxy サーバーからアプリケーション・サーバーへのヘルスチェックが access.log に溜まるのは嫌なだなーと思ったので Fluentd で何とかならないかなって思っていたら簡単に何とかなったけどメモ。

Apache や Nginx であれば、それぞれの設定でログに記録させない方法があるけど、Web サーバーを簡単に再起動出来ないけどログをちゃんと収集したい等のニーズ(があるか分からない)がある場合に役立つかな。

メモ

fluent-plugin-rewrite を使う

個人的に fluent-plugin-rewrite を利用するのがサクッと動いて嬉しかった。

ということで…

アクセスログを眺めていたら ELB のユーザーエージェントは ELB-HealthChecker という名前のようなので以下のように設定した。

<match kondou.*>
  type copy
  <store>
    type rewrite
    add_prefix filtered
    <rule>
      key     user-agent
      pattern (ELB-HealthChecker|xxxx)
      #ignore  true
      append_to_tag true
      tag     ua
    </rule>
  </store>
</match>

<match filtered.kondou.masahiko>
  type stdout
</match>

<match filtered.kondou.masahiko.ua>
  type stdout
</match>

上記の例では、まず add_prefix オプションで filterd というタグを付けている。そして user-agentELB-HealthChecker が含まれている場合には append_to_tag にて tag で指定したタグを付けてルーティングする。また ignore true を付けることでパースの処理を無視(行わない)することもできる。(今回は動作確認をする為に appentd_to_tag を利用してタグを付けている。)

動作確認

以下のように実行する。

echo '{"path":"/hoge","user-agent":"hoge"}' | /usr/lib64/fluent/ruby/bin/fluent-cat kondou.masahiko

以下のように td-agent.log に記録される。

2015-02-08 13:33:26 +0900 filtered.kondou.masahiko: {"path":"/foo","user-agent":"foo"}

次に以下のように実行する。

echo '{"path":"/health-check","user-agent":"ELB-HealthChecker"}' | /usr/lib64/fluent/ruby/bin/fluent-cat kondou.masahiko

以下のように出力される。

2015-02-08 13:33:34 +0900 filtered.kondou.masahiko.ua: {"path":"/health-check","user-agent":"ELB-HealthChecker"}

後は煮るなり焼くなり…。

おわり

本日の知見。

  • キーに含まれる値でルーティングさせたい場合には fluent-plugin-rewrite が俄然捗る
  • 他にも同様のことができるプラグインはあるのかしら

元記事はこちらです。
俺のメモ – ELB からのヘルスチェックアクセスで出力されるアクセスログを fluentd で良しなに振り分けるメモ