Fluentd (td-agent) で日時フォーマット (datetime) を変更する方法

Fluentd (td-agent) で日時フォーマット (datetime) を変更する方法

もし Fluentd (td-agent) で列値の日時フォーマット (datetime) を変更する必要がある場合、"record_transformer" プラグインを使います。このプラグインは td-agent3 では既にインストールされています。

ここでは "2017-12-19 16:09:31" というフォーマットを "2017-12-19T16:09:31+09:00" という ISO 8601 形式のフォーマットに変更します。私の知る限り、いくつかの NoSQL データベース等は ISO 8601 形式の日時フォーマットしか解釈できないものもあるようです。もし ISO 8601 形式と異なる日時情報がログファイルなどにある場合には、ここで紹介する方法で変換しておくと良いでしょう。


Fluentd (td-agent) で任意の日時フォーマットを ISO 8601 形式に変換する

Fluentd (td-agent) の中では Ruby 言語を利用することが出来ますので、Ruby 言語を使って日時情報を ISO 8601 形式に変換してみましょう。

以下の設定では、"datetime_received" という列値を ISO 8601 形式に変換します。Ruby 言語には "iso8601" というメソッド(関数)がありますので、その関数を呼び出します。その結果として日時データを ISO 8601 形式に簡単に変更することが出来ます。

<filter tail_ex.linelog>
  @type record_transformer
  enable_ruby true
  auto_typecast true
  <record>
    datetime_received ${require 'time'; Time.parse(record["datetime_received"].to_s).iso8601.to_s}
  </record>
</filter>

以下のような日時情報が与えられた場合、
[Before convert]
"2017-12-19 16:09:31"

次のように ISO 8601 形式の日付データを得ることが出来ます。
[After converted]
"2017-12-19T16:09:31+09:00"