📝

いまさら fluentd v1 をはじめてみた、その1

2021/04/05に公開

いまさら fluentd v1 はじめてみる

fluentd + Kibana + elasticsearch」 やら 「fluentd + MongoDB」とログ解析してDBに入れつつグラフ化しちゃうなんて巷で流行っているな~~と指をくわえてみてたんです。そして1年経過・・・そろそろやらねば!と重い腰をあげてみました。そしてまたハマったw
※fluentd v2がでております~

fluentd って

システム構築したことある人なら経験があるように各システムに散らばったログを収集&解析、グラフ化するのって簡単そうで結構大変な作業ですよね。fluentd は、ruby で書かれたログ解析ツール(ログ収集管理ツール?)で、このツールを使うことにより簡単に処理できるようになります。
また多彩な入出力プラグインが用意されていますし、こんなのないかな?と思うと別途公開されていたりと殆ど自分で作成する必要がない位に充実しています。

fluentdによるログ収集システムの構築~基本編
Fluentdにおけるログ運用

ハマった

マニュアルを嫁、といわれそうですが・・・。fluentd でのin/outはすべて json で処理されるということ。
そのためアプリケーションログに対し入力プラグインに対応していないとだめw。かといっても正規表現を少し勉強すれば対応可能。

とりあえず初心者らしくかる~く実装してみます

nginx ⇒ fluentd ⇒ MongoDB」の記事が多くヒットするのですが、ここは初心者っぽいとこから実装してみます。構成として以下のような感じ(vm を3つ用意してね)。
あと入力するログ(aa.log/bb.log)は、勉強用のため独自フォーマットにしてみました。
※だって apache やら nginx だとプラグインがあるので・・・

fluentd_1.png

fluentd のインストール

対象のサーバ(送信側、受信側)に fluentd をインストールします。環境によってインストールする手順は違えども基本的に簡単に導入できます。
※shを見るとわかるけけど /etc/yum.repos.d/td.repo にレポジトリを登録します。

command
$ sudo su
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

送信側の設定

/tmp/aa.log に行が追加されたイベントで td-agent が動作し、ログ収集サーバに http でデータを転送する設定を行います(/tmp/bb.log も同じ)。

<source>
  type tail
  path /tmp/aa.log
  pos_file /tmp/access.pos
  format /^(?<date>[^\]]*) (?<host>[^ ]*)$/
  time_format %d/%b/%Y:%H:%M:%S
  tag test.access
</source>

<match test.access>
  type forward
  buffer_chunk_limit 256m
  buffer_queue_limit 128
  flush_interval 5s
  <server>
    host 192.168.11.106
    port 24224
  </server>
</match>

ここで特筆すべき点は、sourceディレクティブ の 「format」です。正規表現で指定しますが特殊な記述の方法なので独自ログを解析しようと思った場合は少し手間がかかるので、Fluentular サイトで試行錯誤しながら作成するのが楽チンです。

fluentdのformat(正規表現)の作り方について試行錯誤中

受信側の設定

データを http で受信し /var/log/td_log/td_access に結果を出力する設定を行います。

<source>
  type forward
  port 24224
</source>

<match test.access>
  type file
  time_slice_format %Y%m%d_%H%M
  time_slice_wait 1m
  path /var/log/td_log/td_access
  time_format %Y%m%dT%H%M%S%z
</match>

type file プラグインが更新されているのか、ググと上記の設定で td_access.log ができるお!と書いてあるけど実際には「 td_access.log + time_slice_format + _0.log」で出力されます。
また td__access.20140622_1413.b4fc65c8fe4bf524b 形式のファイル名になってしまうのは、fluentd がログデータを確定する前段階のファイルとして一時ファイルを作成するからです(time_slice_format の形式でまとまるらしい)。

fluentdでTimeSlicedOutputを使ったプラグインを書いてみた

テスト方法

fluentd が動作して状態をみることによりイベントの流れが判ると思うので最初は、td-agent -vv コマンドを送受信側で起動しいたほうがよい。構文エラーの場合も起動せず止まるので原因が追究しやすい。

$ sudo td-agent -vv

送信側

$ echo "22/Jun/2014:09:14:05 aaaa" >> /tmp/aa.log          # ログとして有効なことを確認
$ echo "22/Jun/2014:09:14:05 aaaa ddd fff" >> /tmp/aa.log  # ログとして無効なことを確認

さて運用してみるか

実際にサービスとして起動してみます。 ログが出力されない状態になるかもしれません。
しかもサービスを起動しても [OK] って表示されれている・・・。
そんなときは、fluentd の起動ログ /var/log/td-agent/td-agent.log を見ましょう。ここにすべてが書いてあるw
※td-agent ユーザで td-agent を起動するので 「:EACCES: Permission denied」になってるときもある。

# /etc/init.d/td-agent restart
Starting td-agent:                                         [  OK  ]

次は

ltsv プラグンを使った方法を勉強してみる(その2)の予定ですw

参考サイト

td-agent(fluentd)のposファイルの作成タイミングとかその他もろもろもメモ
【fluentd初心者】td-agentに起動偽装された件について
fluentdの簡単な使い方、設定方法一覧

GitHubで編集を提案

Discussion