2015年10月21日水曜日

out_exec プラグインを使ってtail したログを MQTT に publish してみた

概要

tail した json ログの情報をそのまま MQTT に publish してみました
publish には out_exec プラグイン を使いました

環境

  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.10
  • Ruby 2.1.5p273
  • Gem 2.2.2
  • fluentd 0.12.16

各種インストール

fluentd のインストールに関してはこちらを御覧ください
out_exec プラグイン自体はデフォルトで使える状態なので特にインストール作業は不要です

今回 publish に使ったツールは「mosquitto-clients」でこれを使うことで CLI で MQTT ブローカにメッセージを publish することができます
インストール方法は以下の通りです

  • sudo apt-get -y install mosquitto-clients

これで mosquitto_submosquitto_pub というコマンドが使えるようになります
fluentd で使用するのは mosquitto_pub になります

ちなみに CLI 単体で使用する例は以下の通りです

mosquitto_pub -h your.broker.domain -p 1884 -t topic/test -u username -P password -m “test”

  • ホスト名 (-h)
  • ポート (-p)
  • メッセージを送信するトピック (-t)
  • ユーザ名 (-u)
  • パスワード (-P)
  • メッセージ (-m)

というオプションを付与して実行しています
これを fluentd で実行することでメッセージを publish してみます

設定ファイル編集

in

まず in 側ですが type tail でログファイルを tail して1行ずつ処理することを想定しています

in の設定例として以下のような感じかと思います

<source>
  type tail
  path /path/to/log/hoge_json.log
  pos_file /path/to/log/hoge_json.log.pos
  tag hoge_json.log
  format json
  time_key time
  time_format %Y-%m-%dT%H:%M:%S%z
</source>

out

次に out 側ですがここで exec プラグインを使用します
exec プラグインは任意のコマンドを実行できるプラグインです
また、in から受け取った情報をバッファ用のファイルに一旦出力し、そのファイルを引数として受け取ることができます
その特性と mosquitto_pub を組み合わせることで publish を実現します

設定は以下のようになると思います

<match hoge_json.log>
  type exec
  command /usr/bin/mosquitto_pub -h your.mqtt.host -p 1883 -t topic/test -u username -P password -f 
  format json
  flush_interval 5s
  buffer_path /etc/fluentd/buffer
</match>

ポイントを説明します
まず command パラメータですが、ここに実行するコマンドを記載します
PATHや実行ユーザの関係があるのでコマンドへはフルパスで記載したほうが無難です
必要なオプションを記載していきますが、最後の「-f」オプションがポイントです
先ほどは「-m」オプションでメッセージを publish する方法を紹介しましたが mosquitto_pub コマンドは「-f」オプションを使うことで指定されたファイルに記載されている情報を publish することができます
このオプションがあるために out exec プラグインとの親和性があると思っています
コマンドが成立するために「-f」オプションの後ろに半角スペースが 1 つあることに注意してください

肝心の引数として渡されるファイルですが buffer パラメータで指定されたパス配下に自動で作成されます
ここで作成されたファイルがコマンドの引数として渡されます

試す

あとは試すだけです
すでに json のログがうまく in できているのであれば今回の out を追加するだけで動作するはずです
うまく publish されない場合は、まず mosquitto_pub コマンド単体でちゃんとブローカに publish できるか確認することをおすすめします
subscribe の確認は mosquitto_sub というコマンドが同時に使えるようになっているのでこれを使えばいいと思います
もちろん別の方法でもOKです

最後に

おそらく fluentd 的には out exec プラグインを使ってコマンドを実行するのではなく、プラグインをちゃんと作成して実行するのが正しいんだと思います
今回はたまたま思いついて試したらできたので紹介してみましたが、もしかしたら MQTT に pusblish できるプラグインはすでにあるかもしれません
( subscribe するプラグインはありましたが、publish するプラグインは見つけられませんでした)
まぁそもそもログを MQTT に publish すること自体あまり需要がないのかもしれませんが、、

以上

0 件のコメント:

コメントを投稿