どうも、手短野郎かっぱ(@inokara)です。今回も手短に。
効率よく = 設定ファイルを最小限に
下図のように複数の VirtualHost のアクセスログファイルを読み込んで S3 のバケットに読み込むファイル毎にフォルダを作ってログを放り込むようなことをしたいと思った時に…
うっかりとして各ログファイル毎に 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.xxxxx
とapache.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 を使ってログを効率よく出し分けたのでメモ」