質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • IoT

    58questions

    IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

  • Fluentd

    44questions

    Fluentdは、オープンソースのログ収集ツールです。ログの収集方法、ログの記録先などのログデータ処理を柔軟にカスタマイズでき、インプットおよびアウトプットが全てプラグインとして実装されています。

  • MQTT

    28questions

    MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Fluentdでセンサーのログを項目毎に振り分けて保存したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 847

hossy

score 9

やりたいこと

Fluentdを使用してMQTTブローカーからセンサーデータを購読し、データの種類毎に保存先を振り分けたいです。
センサーは複合センサーで、データの種類(温度、地軸等)毎に別のメッセージになっています。

最初にやったこと

まず、データの種類で振り分けずに保存する動作検証として、以下の様な設定で動作確認をしました。

<source>
  @type mqtt
  port 1883
  <parse>
    @type json
  </parse>
</source>

<match sensor.**>
  @type file
  path /var/log/td-agent/sensor
</match>

この結果、ファイルには下記の様なログが保存されることは確認できますた。

2017-09-07T16:36:36+09:00    sensor.000000000001    {"message":"{\"deviceId\":\"000000000001\",\"time\":\"2017-09-07T16:36:14.496+09:00\",\"geoMagneticX\":-10.2,\"geoMagneticY\":-6.6,\"geoMagneticZ\":41.1}"}
2017-09-07T16:36:36+09:00    sensor.000000000001    {"message":"{\"deviceId\":\"000000000001\",\"time\":\"2017-09-07T16:36:14.676+09:00\",\"humidity\":59.56,\"temperature\":27.92}"}
2017-09-07T16:36:36+09:00    sensor.000000000002    {"message":"{\"deviceId\":\"000000000002\",\"time\":\"2017-09-07T16:36:15.044+09:00\",\"geoMagneticX\":-8.85,\"geoMagneticY\":-12.75,\"geoMagneticZ\":47.85}"}
2017-09-07T16:36:36+09:00    sensor.000000000002    {"message":"{\"deviceId\":\"000000000002\",\"time\":\"2017-09-07T16:36:15.224+09:00\",\"humidity\":60.44,\"temperature\":27.86}"}

deviceIdがセンサーの識別子で、このログは2台のセンサーからそれぞれ温度と地軸のログの4件分の内容になります。

試してみたこと・問題点

次に以下の様な設定で動作させてみました。

<match sensor.**>
  @type copy
  <store>
    @type relabel
    @label @temperature
  </store>
  <store>
    @type relabel
    @label @geomagnetic
  </store>
</match>

<label @temperature>
  <filter>
    @type grep
    <regexp>
      key temperature
      pattern .*
    </regexp>
  </filter>
  <match>
    @type file
    path /var/log/td-agent/sensor.temperature
  </match>
</label>

<label @geomagnetic>
  <filter>
    @type grep
    <regexp>
      key geoMagneticX
      pattern .*
    </regexp>
  </filter>
  <match>
    @type file
    path /var/log/td-agent/sensor.geomagnetic
  </match>
</label>

この結果、sensor.temperature及びsensor.geomagneticの双方に、温度も地軸も出力される結果となってしまいました。
また、patternの所を「.+」にしたところ、どちらにもログは出力されない結果となりました。

メッセージの内容(項目の有無)によってログを振り分けたい場合、どのような設定をすれば良いでしょうか?

環境

  • CemtOS 7.3
  • fluentd-0.14.20
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

出力データを確認する限りでは、fluentdが認識できているjsonのキーはmessageだけのように見え、messageキーの中にJSON形式のデータがある形式に見受けられます。

{"message":"
{\"deviceId\":\"000000000001\",\"time\":\"2017-09-07T16:36:14.496+09:00\",\"geoMagneticX\":-10.2,\"geoMagneticY\":-6.6,\"geoMagneticZ\":41.1}"}

従って、fluentdでフィルタするのであれば、対象キーはmessageにしないとご期待の動作は得られない気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 10:44

    ありがとうございます。
    以下のようにしてみたところ、やりたいことが出来ました。

    - fluent-plugin-json-nest2flatを導入
    - ただし、このプラグインは古くて(?)「BUG: use router.emit instead of Engine.emit」がログに出力されたので該当箇所を修正
    - "message"を展開する設定にして「pattern .+」でフィルタ

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • IoT

    58questions

    IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

  • Fluentd

    44questions

    Fluentdは、オープンソースのログ収集ツールです。ログの収集方法、ログの記録先などのログデータ処理を柔軟にカスタマイズでき、インプットおよびアウトプットが全てプラグインとして実装されています。

  • MQTT

    28questions

    MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。