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

ほわいとぼーど

ぷろぐらまのメモ帳

Elasticsearchにfluentdする設定とかlabelの話

Elasticsearch fluentd

といっても設定はさほど難しくないです。
収集箇所から直接送信する場合はコチラを参照するとよさそうな感じ。

自分の場合、収集箇所と集計サーバ両方にtd-agent入れてて、
収集箇所はtail_exとforward、集計サーバで集計してgrowthforecastに投げてたり、
今回の場合、後からElasticsearch設定追加したりしてます。
本番でgrowthforecastとElasticsearchを同じサーバに入れないと思うけど、
今はテスト環境ということで。


以下は送信側設定。

<source>
  type        tail_ex
  format      /(正規表現)/
  path        /path/to/apache.log.%Y%m%d
  tag         apache.${HOSTNAME}
  pos_file    /path/to/apache.pos
</source>

<match apache.*>
  type forward
  flush_interval 1s
  <server>
    host ${FORWARD_HOST}
  </server>
</match>

送信側はなんてことはない設定なんですが、ポイントはtagのHOSTNAMEなのかなと。
Elasticsearch内でhost毎に検索したい場合はtagからlog_nameに入れるか、
record-modifierで項目の一つとして入れてしまうかどっちかになると思います。
集計サーバみたいな構成の場合、tagについてるとmatchで対象を制御もできるのでよさげ。

なお、${HOSTNAME}と${FORWARD_HOST}はシェルとかChefで埋めてます。
tail_exの機能?で${hostname}ってtagに使えるのですが、
加工したhost名を使いたかったので設定時に埋めるようにしました。


集計サーバ側の設定は以下。

<source>
  type        forward
</source>

<match apache.**>
  type copy

  <store>
    type forest
    subtype elasticsearch
    remove_prefix apache
    <template>
      type_name apache
      include_tag_key true
      tag_key @log_name
      host localhost
      port 9200
      logstash_format true
      flush_interval 10s
    </template>
  </store>
</match>

実際にはstoreもっとあるけど、Elasticsearchに関係ないところは省略しました。

転送元からはtagが「apache.host」の形で流れてきて、
remove_prefixされて@log_nameには「host」の形で登録されます。
これによりElasticsearch上で「@log_name="host"」な検索ができます。
まぁ、ここまでしなくてもElasticsearchは全文検索エンジンなので、
apache.host」のままで登録されても「@log_name="host"」で絞り込み出来るはず。


こんな感じでfluentdで簡単にElasticsearchにデータ投入できます。
Elasticsearchにはbulk_importする方法も用意されているのですが、
JSONでindex指定やid付与した形に整形必要だったこともありやってません。
過去ログでもfluentd経由で入れてます。fluentd便利!
あとfluentd-plugin-elasticsearch書いてくれた人のおかげ。


ところで、Elasticsearchに関するブログ記事書いてる途中に気づいたんですけど、
自分のlabel名があまり標準的ではないものになってる気がする。
元々はfluentd公式のapache2の書式をベースに正規表現を書いてます。
http://docs.fluentd.org/ja/articles/in_tail の中ほどの「apache2」)
それに対して追加パラメータの一部の項目名が似たようなのがあった部分を装飾したり、
timeのパースをうまくいかないと誤解したためにrequest_timeにしたり。

ところが最近LTSVお勧めというのがあることを知りました。

比較してみますと、

apache2でのlog_format 自分のlabel fluentdサイトのlabel ltsv.orgのrecommended label
%t request_time time time
%>s code code status
%b res_size size size
%{User-agent}i agent agent ua
%l req_size - reqsize
%D response_time - reqtime_microsec
%T - - reqtime

特にrequest_timeが違う用途なのに被ってるのが泣きそう。
といっても急に変えられないのでスキーマの設定は気をつけましょう、
という残念なオチ。
私のElasticsearchの記事を見る際にはパラメータにはご注意を、、、

(追記)「fluentd-plugin-elasticsearchでのログ時刻の扱い」