どうも、手短野郎かっぱ@inokara)です。今回も手短に。

効率よく = 設定ファイルを最小限に

下図のように複数の VirtualHost のアクセスログファイルを読み込んで S3 のバケットに読み込むファイル毎にフォルダを作ってログを放り込むようなことをしたいと思った時に…

01

うっかりとして各ログファイル毎に match ディレクティブを書いてしまいそうになった時、fluent-plugin-forest に出会い、td-agent.conf の設定は下記のように設定することで冗長な td-agent.conf にならずにすみました。

td-agent.conf
<source>
  type tail
  path /var/log/httpd/access_xxxxx.log
  pos_file /var/log/td-agent/access_xxxxx.log.pos
  tag apache.xxxxx
  format apache
</source>

<source>
  type tail
  path /var/log/httpd/access_yyyyy.log
  pos_file /var/log/td-agent/access_yyyyy.log.pos
  tag apache.yyyyy
  format apache
</source>

<match apache.*>
  type forest
  subtype copy
  <template>
    <store>
      type s3
      aws_key_id AKxxxxxxxxxxxxxxxxxx
      aws_sec_key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      s3_bucket your_bucket
      s3_endpoint s3-ap-northeast-1.amazonaws.com
      path ${tag_parts[1]}/
      buffer_path /var/log/td-agent/${tag_parts[1]}
      time_slice_format %Y-%m-%d/%H.log
      time_slice_wait 10m
    </store>
    <store>
      type file
      path /tmp/fluent-${tag_parts[1]}.log
    </store>
  </template>
</match>

上記の設定のポイントは…

  • 複数の source を in_tail して異なるタグを付与(apache.xxxxxapache.yyyyy
  • fluent-plugin-forest でタグを利用して S3 上のバケット以下のタグ名を指定しています
    path ${tag_parts[1]}/

これだと言ったらこれだけですが、fluent-plugin-forest がかなり威力を発揮しているかと思います。上記の例で指定る apache.xxxxx 又は apache.yyyyy というタグがある場合に、以下のようにプレースホルダを指定することで、タグの任意の箇所を指定することが出来ます。

変数 取得出来る箇所
tag_parts[0] apache
tag_parts[1] xxxxx or yyyyy

尚、fluent-plugin-forest ではタグ以外にも以下のようなプレースホルダを指定することが可能です。

  • _HOSTNAME_ (or ${hostname})
  • _ESCAPED_TAG_ (or ${escaped_tag})
  • _TAG_PARTS[n]_ (or ${tag_parts[n]})

詳しくはこちらを御覧ください。


もはや…

fluentd や各種プラグインの作者の方々には…足を向けて寝ることが出来ない毎日です。

元記事は、こちらです。
fluent-plugin-forest を使ってログを効率よく出し分けたのでメモ