目次

Fluentd

logの収集を行う手法には様々あるが、UNIX系OSでは、標準的にはsyslogを利用することが多いと思われる。

しかし、syslogdでは、logの正規化などの処理をうまく行うには大幅な仕掛けが必要なため、今更ながら fluentd を利用することにした。

What is fluentd

fluentdはrubyで動作するlog収集・管理ツールである。その特徴を以下に挙げる。

これにより、データのDBへの入出力や検索などを楽にすることができる。

本記事で想定する fluentd 利用方法

今回は、以下のような形式でfluentdを利用する。

Install fluentd on FreeBSD

fluentdを(例によって) FreeBSD で作成したVMにInstallしてみる。

OSの準備

VMの諸元は以下の通り

CPU vCPU x2
Memory 2G
Disk 0 20G Boot disk
Disk 1 100G Data Disk
NIC 0 Management I/F
NIC 1 Logging I/F
OS FreeBSD 11.2-p4 (2018/10/15)

通常通り、minimum installを行う

fluentdは、大量のFileを扱うことがあるので、limitによる制限を外す必要がある。

Disk1(/dev/ada1) をZFSにして、/zdataとしてmountする。

  1. gpart show
    • ここで、ada1が表示された場合、何らかのformatがなされていることになるので、確認する。
    • ada1を完全に消去する前提なら、gpart destroy -F /dev/ada1を実行
  2. gpart create -s gpt /dev/ada1
    • これで、ada1にGPT Partitionを作成する
  3. gpart add -t freebsd-zfs -l log-data /dev/ada1
    • -t で partition type を、-lで label を指定する
  4. zpool create -O atime=off -O compression=lz4 -O normalization=formD zdata disk /dev/ada1
    • ZFS poolを作成し。/zdataとしてmountする。
    • ここでは、macOSに合わせて normalization formform-D にし、 lz4 で圧縮するようにしている
  5. 必要に応じて、/etc/rc.confに、zfs_enable=“YES”zfsd_enable=“YES”を追加する

基盤の準備

FluentdはRubyを利用する。Rubyの環境は、(個人的に)保守がとても面倒なので、RubyEnvを利用することにする

rbenvのInstall

  1. rbenvを導入するためにgitとbashが必要
    • あんまり余計なものは入れたくないのだが…仕方がないか。
    • pkg install git bash
    • FreeBSDの標準のUIDを設定する
      • vipw で、fluentd:*:963:963::0:0:fluentd user:/nonexistent:/usr/sbin/nologinを追加
      • vi /etc/group を実行し fluentd:*:963:を追加
  2. githubからrbenvを引っ張ってくる
    • # cd /usr/local
      # git clone git://github.com/sstephenson/rbenv.git
      # mkdir /usr/local/rbenv/plugins
      # cd /usr/local/rbenv/plugins
      # git clone git://github.com/sstephenson/ruby-build.git
    • 個人の.profile等に以下を追加
      # for rbenv...
      export RBENV_ROOT="/usr/local/rbenv"
      export PATH="${RBENV_ROOT}/bin:${PATH}"
      eval "$(rbenv init -)"
    • もちろん、以下の作業前に source しておくこと
  3. RubyのInstall
    1. まず、InstallできるRubyのVersionを確認する
      • rbenv install –list
    2. RubyをInstallする
      • sudo rbenv install 2.5.1
      • sudo rbenv rehash
    3. System WideにDefaultを設定する
      • sudo rbenv global 2.5.1
    4. 実行されるrubyのVersionを確認する
      • ruby -v

これで、FreeBSD上に rbenv+ruby 2.5.1を実行できる環境が完成する。 ただし、ruby関連の実行バイナリーは/usr/local/rbenv/bin配下にあるので注意

fluentdの準備

fluentdのInstallに関する情報は ここ を参照

  1. gem install fluentd -N

これだけで、fluentdはinstallされる。

fluentdで収集したlog dataは、/zdata/fluentd配下に蓄積する。

# cd /zdata
# mkdir fluentd
# cd fluentd
# fluentd --setup ./fluent
# fluentd -c ./fluent/fluent.conf -vv &

これで、fluentdにメッセージが送れるようになったので、fluentdを停止する

動作確認が取れたところで、一度cleaningする

起動script

FreeBSDのPORTSから拝借した。/usr/local/etc/rc.dに配置する

fluentdの設定と試験

設定の細かい部分は ここ を参照

fluentdでsyslogを受ける

Fluentdは syslog/UDP に来たsyslogメッセージを受け付けることができる。

<source>
  type syslog
  format none
  port 514
  bind 0.0.0.0
  tag syslog
</source>

受け取ったメッセージをファイルに書き出す

ここでは、上記syslogで受け取った “syslog” tagのついたメッセージを、/zdata/fluentd/syslog下に書き出す。

Syslogの場合、メッセージの構成が “Tag.facility.level“となっているので、match構文もそれに合わせる必要がある。

<match syslog.*.*>
  @type       file
  buffer_type file
  path        /zdata/fluentd/syslog
</match>

実際にsyslogを送信してみる

  1. fluentdを起動する
    • service fluentd start
    • psコマンドでfluentdが起動されていることを確認する
    • service fluentd stop
    • psコマンドでfluentdが終了していることを確認する
    • 再度fluentdを起動する
  2. localhostからloggerコマンドでlogを送付
    • logger -h 127.0.0.1 “Syslog message test from local
    • このメッセージが設定に記載されているlogファイルに記載されればOK
  3. remoteからloggerコマンドでlogを送付
    • logger -h logger-host “Syslog message test from local
    • このメッセージが設定に記載されているlogファイルに記載されればOK

落穂拾い

plugin 全般

Fluentdは大量のpluginを持っている。pluginを管理するには、fluent-gemを利用する。

syslog plugin

Fluentdのsyslog pluginは、標準で2048 byteまでしかメッセージを受け付けない。 これを拡張するには、fluent.confのsyslog設定の中で、message_length_limit 8192などとする。

<source>
  @type               syslog
  #....
  message_length_limit 8192
</source>

syslog pluginは、標準では、送信元の情報を出力しない。これを出力するには include_source_host truesourceセクションに追記する

Update fluentd on FreeBSD

fluentdの更新

FluentdのUpdateは、gemを更新するだけで良い。

つまり、gem outdatedしてgem update すればOK

RubyのVersion up

本環境の場合、ruby自体の更新を行う場合、以下の作業が必要になる。

# cd /usr/local/rbenv
# git pull
# cd /usr/local/rbenv/plugins/ruby-build
# git pull
# rbenv install [target version]
# rbenv rehash
# rbenv global [target version]

これで、Ruby自体のVersionが上がる。しかし。この状態では、ruby環境全てを更新してしまったので、当然fluentdは起動できなくなる。 そこで、以下の作業を実行し、fluentdをinstallする

# gem install fluentd -N

これで、service fluentd stop; service fluentd start を実行すれば、fluentdが更新されるはず。