brand new note

インフラエンジニアを目指す大学院生のメモ

fluentdを使ってみる

研究でログ収集ツールの 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> この中に出力プラグインの設定を書いていく。どういうふうに、どこにデータを渡しますか、の部分。

    f:id:frazz:20170920235318p:plain
    考え方はこんなん

便利なことに、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

柔軟なログ収集を可能にする「fluentd」入門 2ページ | さくらのナレッジ

fluentd最低限のメモ - Qiita

いまさらだけど fluentd に入門した - えいのうにっき