転載・引用について

ユーザ用ツール

サイト用ツール


サイドバー

Site Contents Index

転載・引用について

RSS

serverapp:logging:fluentd

Fluentd

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

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

What is fluentd

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.confkern.maxfiles=65536及びkern.maxfilesperproc=65536を追加する

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を停止する

  • 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を送信してみる

  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を利用する。

  • 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 truesourceセクションに追記する

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が更新されるはず。

このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
serverapp/logging/fluentd.txt · 最終更新: 2020/12/22 17:19 by seirios