研究でログ収集ツールの fluentd (td-agent)を使うことになったので、メモしておきます。 今回は初めて使うので、目標はこんな感じです。
fluentdの概要をつかむ
送信元サーバからログ収集用サーバにデータを投げる挙動を確認する
fluentdとは
複数のサーバやクラウドのログをまとめて収集するのに有用なツール。他にも収集ツールにはsyslogdとかいうのもあるらしい。 ログを取りたいマシンと、そのログを集めて置いておくマシンにインストールすると、その間でデータの橋渡しをする。 標準出力やsyslogなどからデータを起こすことができ、収集したものは同じくログファイルにしたり、mongodbなどのデータベースに突っ込むことができる。理解できるととても便利みたい。
インストールは公式サイトを使って、
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
インストールしたら設定ファイルは /etc/td-agent/td-agent.conf になるので、これを書き換えてログを取れるようにしていく。
設定ファイルの読み方
なんかこのHTMLタグみたいなやつ < > のことをディレクティブという。 一番大事なディレクティブは2つ。
<source>~</source> この中に入力プラグインの設定を書いていく。どんなデータを拾ってきますか、の部分。
<match>~</match> この中に出力プラグインの設定を書いていく。どういうふうに、どこにデータを渡しますか、の部分。
便利なことに、sourceとmatchの組み合わせは分類したいデータの種類数だけいくつも書くことができます。この関連付けをするために、「どこに向って投げるのか=tag」を指定する必要があります。
他にも沢山機能はありますが、とりあえずこれを使ってログを宛先サーバに飛ばしてみます。 今回は簡易的に、送信元で1秒ごとにdateコマンドをログファイルに出力させるスクリプトを書きました。
#!/bin/bash while true; do date >> exp1.log; sleep 1s; done &
confを書いて生成されたログファイルを飛ばします。
送信側
<source> type tail #ログの末尾を引っ張ってくる path /root/hoge/exp1.log #ファイルを指定 tag log.exp1 pos_file /var/log/td-agent/ex_log.pos #ファイルを何行目まで読んだか記録できるファイルを生成 format none </source> <match log.exp1> type forward #TCPIPを使って飛ばす host xx.xx.xx.xx #宛先IPアドレス port 24224 #デフォルト値らしい </match>
受信側
<source> type forward #TCPIPを使って受け取る bind 0.0.0.0 #これがないと動かなかった… port 24224 </source> <match log.exp1> type syslog </match>
書いたらservice td-agent start もしくは service td-agent reloadで起動します。エラーは実行時か/var/log/td-agent/td-agent.logに出るので、直るまで設定ミスを見直します。
受信したログもデフォルトで/var/log/td-agent/td-agent.logにたまるそうです。(たまる先を受信側matchで指定しようとしましたができませんでした、なぜだ)
2017-09-21 00:34:13 +0900 log.exp1: {"message":"Thu Sep 21 00:34:13 JST 2017"} 2017-09-21 00:34:14 +0900 log.exp1: {"message":"Thu Sep 21 00:34:14 JST 2017"} 2017-09-21 00:34:15 +0900 log.exp1: {"message":"Thu Sep 21 00:34:15 JST 2017"} 2017-09-21 00:34:16 +0900 log.exp1: {"message":"Thu Sep 21 00:34:16 JST 2017"}
見たところ、こんな感じで日付の情報が飛んできました。とりあえずOKです。
補足
データを簡単にやりとりするにはユーザ情報をいじる必要もあるみたいで、/etc/init.d/td-agentのTD_AGENT_USER、TD_AGENT_GROUPの項目をrootに書き換えました。でもこれはセキュリティ上あまりよくなさそうですね。ファイルのパーミッションをtd-agentにしたほうがいいのかな。
おわりに
今回はfluentdのインストールから動作確認ができたのでまとめました。英語のドキュメントやJSONにはまだ慣れないですが、結構先人達の攻略情報が多かったのでなんとかなりました。間違って理解してる点もあるかもですが… これから複数台のサーバに使って色々試していきたいと思います。
参考サイト
Fluentd | Open Source Data Collector | Unified Logging Layer