目次
Fluentd
logの収集を行う手法には様々あるが、UNIX系OSでは、標準的にはsyslogを利用することが多いと思われる。
しかし、syslogdでは、logの正規化などの処理をうまく行うには大幅な仕掛けが必要なため、今更ながら fluentd を利用することにした。
What is fluentd
- fluentd 本家
- Fluentdとはどのようなソフトウェアなのかtagomorisさんの記事
fluentdはrubyで動作するlog収集・管理ツールである。その特徴を以下に挙げる。
- さまざまなソースからのイベントをさまざまな媒体に出力できる
- ログの種類はタグで管理される
- ログの内容はJSON形式
これにより、データのDBへの入出力や検索などを楽にすることができる。
本記事で想定する fluentd 利用方法
今回は、以下のような形式でfluentdを利用する。
- 各サービスサーバーからlogging system(以下log server)へは、syslogを利用してlogを転送する
- log serverでは、fluentdがsyslog portを利用してlogを待ち受ける
- fluentdは、受診したlogを
/zdata/fluentd
にfileとして書き出す- 将来は、PostgreSQL等に書き出すことも考慮するが、今はfileに書き出す。
- Service Serverには、原則として追加となるdaemonやProgram/Scriptは設置しない
- log serverは二重化するが、同期はしない。二重化は、syslog側で、複数台にlogを飛ばすことで行う
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による制限を外す必要がある。
/etc/sysctl.conf
にkern.maxfiles=65536
及びkern.maxfilesperproc=65536
を追加する
Disk1(/dev/ada1) をZFSにして、/zdataとしてmountする。
gpart show
- ここで、ada1が表示された場合、何らかのformatがなされていることになるので、確認する。
- ada1を完全に消去する前提なら、
gpart destroy -F /dev/ada1
を実行
gpart create -s gpt /dev/ada1
- これで、ada1にGPT Partitionを作成する
gpart add -t freebsd-zfs -l log-data /dev/ada1
-t
で partition type を、-l
で label を指定する
zpool create -O atime=off -O compression=lz4 -O normalization=formD zdata disk /dev/ada1
- ZFS poolを作成し。/zdataとしてmountする。
- ここでは、macOSに合わせて normalization form を form-D にし、 lz4 で圧縮するようにしている
- 必要に応じて、
/etc/rc.conf
に、zfs_enable=“YES”
とzfsd_enable=“YES”
を追加する
基盤の準備
FluentdはRubyを利用する。Rubyの環境は、(個人的に)保守がとても面倒なので、RubyEnvを利用することにする
rbenvのInstall
- 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:
を追加
- 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 しておくこと
- RubyのInstall
- まず、InstallできるRubyのVersionを確認する
rbenv install –list
- RubyをInstallする
sudo rbenv install 2.5.1
sudo rbenv rehash
- System WideにDefaultを設定する
sudo rbenv global 2.5.1
- 実行されるrubyのVersionを確認する
ruby -v
これで、FreeBSD上に rbenv+ruby 2.5.1を実行できる環境が完成する。 ただし、ruby関連の実行バイナリーは/usr/local/rbenv/bin配下にあるので注意
fluentdの準備
fluentdのInstallに関する情報は ここ を参照
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を停止する
pkill -f fluentd
動作確認が取れたところで、一度cleaningする
rm -rf /zdata/fluentd && mkdir /zdata/fluentd && chown fluentd:fluentd /zdata/fluentd && chmod 755 /zdata/fluentd
起動script
FreeBSDのPORTSから拝借した。/usr/local/etc/rc.d
に配置する
/usr/local/etc/rc.d/fluentd
- fluentd
#!/bin/sh # $FreeBSD: head/sysutils/rubygem-fluentd/files/fluentd.in 366153 2014-08-25 21:16:56Z swills $ # # PROVIDE: fluentd # REQUIRE: LOGIN # KEYWORD: shutdown # # Add the following lines to /etc/rc.conf.local or /etc/rc.conf # to enable this service: # # fluentd_enable (bool): Set to NO by default. # Set it to YES to enable fluentd. # fluentd_config (path): Set to %%PREFIX%%/etc/fluentd/fluent.conf # by default. # fluentd_flags (str): Set to "" by default. . /etc/rc.subr name=fluentd rcvar=fluentd_enable extra_commands="init" load_rc_config $name : ${fluentd_enable:="NO"} : ${fluentd_config="%%PREFIX%%/etc/fluentd/fluent.conf"} : ${fluentd_dir="%%PREFIX%%/etc/fluentd"} : ${fluentd_user="%%USER%%"} : ${fluentd_group="%%GROUP%%"} : ${fluentd_flags:=""} PATH="${PATH}:/usr/local/bin" # for rbenv... export RBENV_ROOT="/usr/local/rbenv" export PATH="${RBENV_ROOT}/bin:${PATH}" eval "$(rbenv init -)" start_precmd="fluentd_start_precmd" command=/usr/local/rbenv/shims/${name} pidfile=/var/run/${name}/${name}.pid #command_interpreter="/usr/local/rbenv/shims/ruby" stop_cmd='pkill -f fluentd' command_args="-d $pidfile -c $fluentd_config" fluentd_start_precmd() { install -d -o ${fluentd_user} -g ${fluentd_group} -m 775 ${fluentd_dir} install -d -o ${fluentd_user} -g ${fluentd_group} -m 775 /var/run/fluentd } run_rc_command "$1"
/etc/rc.conf.local
に以下を追記するfluentd_enable="YES" fluentd_config="/zdata/fluentd/fluent.conf" fluentd_dir="/zdata/fluentd" fluentd_user="fluentd" fluentd_group="fluentd" fluentd_flags=""
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を送信してみる
- fluentdを起動する
service fluentd start
- psコマンドでfluentdが起動されていることを確認する
service fluentd stop
- psコマンドでfluentdが終了していることを確認する
- 再度fluentdを起動する
- localhostからloggerコマンドでlogを送付
logger -h 127.0.0.1 “Syslog message test from local
- このメッセージが設定に記載されているlogファイルに記載されればOK
- remoteからloggerコマンドでlogを送付
logger -h logger-host “Syslog message test from local
- このメッセージが設定に記載されているlogファイルに記載されればOK
落穂拾い
plugin 全般
Fluentdは大量のpluginを持っている。pluginを管理するには、fluent-gem
を利用する。
fluent-plugin-grep
を導入fluent-gem install fluent-plugin-grep
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 true
をsourceセクションに追記する
Update fluentd on FreeBSD
fluentdの更新
FluentdのUpdateは、gemを更新するだけで良い。
gem outdated
: 更新が必要なgemを探すgem update
/gem update [gem name]
: 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が更新されるはず。