概要
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_sub
と mosquitto_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 件のコメント:
コメントを投稿