4

Guyz... 私たちは立ち往生しています.. 私たちを救ってください! :-)

Fluentd を使用して 3 ステップのログ集計パイプラインを作成しています。

[#1 - ログの末尾 (生ログ)] --(TCP)--> [#2 - 読み取ったログを JSON に解析] --(TCP)--> [#3 - フィルタリングして Redis & Mongo に出力]

最初のステップで末尾のログを JSON に変換していません。これは主に、そのサーバーで余分な CPU 消費を避けたいという事実によるものです。私たちが持っているログ行はかなり複雑で、解析はステップ 2 (別のクラスター/サーバー上) で意図的に延期されています。

したがって、フェーズ #1 は、時間、タグ、および記録 (生のログ行) を発行します。ここでは in_tail プラグインを使用しているため、デフォルトで「time」属性はレコードがファイルから読み取られた時刻を示します。そのため、負荷がかかると、読み取り時間がログ行の実際のタイムスタンプと一致しない可能性があります。

JSON の解析は、第 2 フェーズに延期されます。

2 番目のフェーズでは、ログを JSON に変換したら、フェーズ 1 で送信された「時間」属性を JSON レコードの時間属性にオーバーライドします。

ステップ 2 では Fluent-Plugin-Parser を使用します ( https://github.com/tagomoris/fluent-plugin-parser )。

ステップ 1 で読み取った「時間」の代わりに、時間属性をオーバーライドして FluentD にそれを使用させるにはどうすればよいでしょうか?

4

1 に答える 1

15

はい、次のように、fluent-plugin-parser の文書化されていない機能「time_key」でこれを行うことができます。

<source>
  type exec
  run_interval 3s
  format json
  command echo '{"message":"hello,2013-03-03 12:00:13"}'
  tag first
</source>

<match first>
  type parser
  key_name message
  time_key my_time
  time_format %Y-%m-%d %H:%M:%S
  format /^(?<some_field>[^,]*),(?<my_time>.*)/
  tag second
</match>

<match second>
  type stdout
</match>

上記のコード スニペットの機能は次のとおりです。

  1. {"message":"hello,2013-03-03 12:00:13"}これは、タグ「first」を使用して 3 秒ごとにメッセージを生成します。これはテスト用です。
  2. に対して照合され<match first>ます。次に、パーサー プラグインが「message」というフィールドを正規表現で解析します。あなたの場合、それはformat json.
  3. time_key my_time「メッセージ」フィールドの解析された値内のフィールドを探すようにパーサー プラグインに指示し、存在する場合は、そのフィールドをtime_format %Y-%m-%d %H:%M:%S. この時点から、これは新しい時間です
  4. 最後に、標準出力に出力します。

上記の conf を実行すると、次のような出力が得られるはずです。

root@ae4a398d41ef:/home/fluentd# fluentd -c fluent.conf
2014-05-31 00:01:19 +0000 [info]: starting fluentd-0.10.46
2014-05-31 00:01:19 +0000 [info]: reading config file path="fluent.conf"
2014-05-31 00:01:19 +0000 [info]: gem 'fluent-plugin-parser' version '0.3.4'
2014-05-31 00:01:19 +0000 [info]: gem 'fluentd' version '0.10.46'
2014-05-31 00:01:19 +0000 [info]: using configuration file: <ROOT>
  <source>
    type exec
    run_interval 3s
    format json
    command echo '{"message":"hello,2013-03-03 12:00:13"}'
    tag first
  </source>
  <match first>
    type parser
    key_name message
    time_key my_time
    time_format %Y-%m-%d %H:%M:%S
    format /^(?<some_field>[^,]*),(?<my_time>.*)/
    tag second
  </match>
  <match second>
    type stdout
  </match>
</ROOT>
2014-05-31 00:01:19 +0000 [info]: adding source type="exec"
2014-05-31 00:01:19 +0000 [info]: adding match pattern="first" type="parser"
2014-05-31 00:01:19 +0000 [info]: adding match pattern="second" type="stdout"
2013-03-03 12:00:13 +0000 second: {"some_field":"hello"}
2013-03-03 12:00:13 +0000 second: {"some_field":"hello"}
2013-03-03 12:00:13 +0000 second: {"some_field":"hello"}
2013-03-03 12:00:13 +0000 second: {"some_field":"hello"}
于 2014-05-31T00:01:52.627 に答える