Fluentd + Elastichsearch + Kibana(2)MacでFluentdを動かそう

インストールと起動

MacにFluentdをインストールし、Macで動くアプリのログを、Elastichsearchが動くサーバへと転送する。FluentdのダウンロードページにMac用のdmgイメージがあるので、これをダウンロードし実行する。

Mac Fluentd dmg

Macのデーモンは、launchctlと呼ばれるツールで管理される。launchctlは、設定ファイル(plist)のロードによってデーモンを登録し、デーモンの開始や終了など制御する。通常は、デーモンの登録を行った上で、デーモンの開始を行うという流れとなるが、設定ファイル内で「RunAtLoad = true」が設定されている場合は、ロードと同時にデーモンが起動され、OSの起動時にも自動的にデーモンは起動する。

Fluentd(td-agent)の設定ファイルは、「RunAtLoad = true」に設定されているため、設定ファイルをロードするだけで、デーモンは起動され、自動起動に設定される。

launchctl load /Library/LaunchDaemons/td-agent.plist 

元データの設定

Fluentdは、元データの指定と転送先の指定が必要となる。元データは以下のような種類を指定できる。

ログファイルから取得する

転送ログの元データを指定する。設定するパラメータは以下の通り。

パラメータ 意味
type tail
path ログファイルのパス
pos_file 読み込んだ位置を記憶しておくファイル
tag ログの識別子
<source>
  type tail
  format apache
  path /var/log/httpd-access.log
  tag td.apache.access
</source>

httpから取得する

http通信によってデータを取得する。設定するパラメータは以下の通り。

パラメータ 意味
type http
port ポート番号

tagは、URLヘッダで指定する。

<source>
  type http
  port 8888
</source>

実行したコマンドの標準出力から取得する

コマンドの実行によってデータを取得する。設定するパラメータは以下の通り。

パラメータ 意味
type exec
command 実行するコマンド
tag ログの識別子

他のFluentdから取得する

他のFluentdから転送されたデータを受信する。設定するパラメータは以下の通り。

パラメータ 意味
type forward
<source>
  type forward
</source>

設定例

今回は、Macで動作するアプリが出力する以下の形式のログを元データに指定する。

ログファイルの例

2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application is started."
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application is initialized."
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Data is received: apple=3, orange=4"
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application will be terminated."

Fluentdは様々なログをJSON形式に変換した上で転送を行う。ログの変換を行うためには、どのようなフォーマットでログが記述されているかを正規表現でFluentdに教えてあげる必要があり、この設定が最も難しい。今回のログは、スペース区切りで、[日付][プロセス情報][ステータス][メッセージ]の情報が並んでいるので、正規表現で表現すると以下のようになる。

sudo vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /tmp/exampleApp.log
  pos_file /var/log/td-agent/exampleApp.log.pos
  tag example.app
  format /(?<time>[^\]]*) (?<process>.*) <(?<stat>.*)> "(?<message>.*)"/
  time_format %Y-%m-%d %H:%M:%S.%N
</source>

出力先の設定

Fluentdは、出力先も様々な方法を選択できる。

標準出力に転送

データを標準出力に転送する。設定するパラメータは以下の通り。

パラメータ 意味
type stdout
<match **>
  type stdout
</match>

ファイルに転送

データをファイルに転送する。設定するパラメータは以下の通り。

パラメータ 意味
type file
path 出力ファイルのパス
time_slice_format ファイル名のサフィックス
time_slice_wait ファイルを分割する時間単位
<match **>
  type file
  path /var/log/fluent/exampleApp.export
  time_slice_format %Y%m%d
  time_slice_wait 10m
</match>

他のFluentdに転送

データを他のFluentdに転送する。設定するパラメータは以下の通り。

パラメータ 意味
type forward
server 転送先サーバの情報

今回は、Macアプリのログを、Elasticsearchを導入した他のサーバに転送したいので、以下の設定とした。

<match **>
  type forward
  <server>
    name server_1
    host XXX.XXX.XXX.XXX
  </server>
</match>

設定ファイル

設定ファイルは以下となった。

sudo vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /tmp/exampleApp.log
  pos_file /var/log/td-agent/exampleApp.log.pos
  tag example.app
  format /(?<time>[^\]]*) (?<process>.*) <(?<stat>.*)> "(?<message>.*)"/
  time_format %Y-%m-%d %H:%M:%S.%N
</source>

<match **>
  type forward
  <server>
    name server_1
    host XXX.XXX.XXX.XXX
  </server>
</match>

Fluentdを再起動して新たな設定ファイルを読み込む。このとき、/var/log/td-agent/td-agent.logに正常なログが吐き出されていたらOK!

launchctl unload /Library/LaunchDaemons/td-agent.plist 
launchctl load /Library/LaunchDaemons/td-agent.plist 

参考になるページ

Pocket