logの収集を行う手法には様々あるが、UNIX系OSでは、標準的にはsyslogを利用することが多いと思われる。
しかし、syslogdでは、logの正規化などの処理をうまく行うには大幅な仕掛けが必要なため、今更ながら fluentd を利用することにした。
fluentdはrubyで動作するlog収集・管理ツールである。その特徴を以下に挙げる。
これにより、データのDBへの入出力や検索などを楽にすることができる。
今回は、以下のような形式でfluentdを利用する。
/zdata/fluentd
にfileとして書き出すfluentdを(例によって) FreeBSD で作成したVMにInstallしてみる。
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
gpart destroy -F /dev/ada1
を実行gpart create -s gpt /dev/ada1
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
/etc/rc.conf
に、zfs_enable=“YES”
とzfsd_enable=“YES”
を追加するFluentdはRubyを利用する。Rubyの環境は、(個人的に)保守がとても面倒なので、RubyEnvを利用することにする
pkg install git bash
vipw
で、fluentd:*:963:963::0:0:fluentd user:/nonexistent:/usr/sbin/nologin
を追加vi /etc/group
を実行し fluentd:*:963:
を追加# 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
# for rbenv... export RBENV_ROOT="/usr/local/rbenv" export PATH="${RBENV_ROOT}/bin:${PATH}" eval "$(rbenv init -)"
rbenv install –list
sudo rbenv install 2.5.1
sudo rbenv rehash
sudo rbenv global 2.5.1
ruby -v
これで、FreeBSD上に rbenv+ruby 2.5.1を実行できる環境が完成する。 ただし、ruby関連の実行バイナリーは/usr/local/rbenv/bin配下にあるので注意
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
FreeBSDのPORTSから拝借した。/usr/local/etc/rc.d
に配置する
/usr/local/etc/rc.d/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は 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>
service fluentd start
service fluentd stop
logger -h 127.0.0.1 “Syslog message test from local
logger -h logger-host “Syslog message test from local
Fluentdは大量のpluginを持っている。pluginを管理するには、fluent-gem
を利用する。
fluent-plugin-grep
を導入fluent-gem install fluent-plugin-grep
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セクションに追記する
FluentdのUpdateは、gemを更新するだけで良い。
gem outdated
: 更新が必要なgemを探すgem update
/ gem update [gem name]
: gemを更新する
つまり、gem outdated
してgem update
すればOK
本環境の場合、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が更新されるはず。