Fluentdのプラグインで日時変換した際の備忘録です。
やりたいこと
Fluentdで取得したログをBigQueryにいれるためにJSTをUTC変換して「+0000」も取り除く必要があります。
「2020-07-06 11:00:00 +0000」 → 「2020-07-06 02:00:00 UTC」
実装
<filter> @type record_transformer enable_ruby <record> goRegistDT ${Time.parse(record['goRegistDT'].to_s.gsub('+0000', '+0900')).utc.strftime('%Y-%m-%d %H:%M:%S')} </record> <record> goModifyDT ${Time.parse(record['goModifyDT'].to_s.gsub('+0000', '+0900')).utc.strftime('%Y-%m-%d %H:%M:%S')} </record> </filter>
その他の方法として、プラグイン側で用意してくれているInjectセクションとParseセクションの利用も検討しました。
問題点としてInjectセクションは複数セクション定義できないことと、FilterセクションだとStdoutやExecのみサポートしており今回の用途には合いませんでした。
Parserもログのタイプを細かく定義する必要があったので採用しませんでした。
<match> <format> @type json </format> <inject> time_key goModifyDT time_type unixtime time_format %Y-%m-%d %H:%M:%S timezone Asia/Tokyo </inject> </match>
inject used plugins
Stdout filter Exec output Exec filter output File output Stdout output
parser
<filter > @type parser key_name goRegistDT <parse> @type regexp expression /(?<goRegistDT>[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} \+[0-9]{4})/ types goRegistDT:time time_key goRegistDT time_type unixtime time_format %Y-%m-%d %H:%M:%S timezone Asia/Tokyo </parse> </filter>
Config: Inject Section - Fluentd
https://www.ppoohh.info/post-823/
Unable to send correct timestamp to ES · Issue #2718 · fluent/fluentd · GitHub
Unable to send correct timestamp to ES · Issue #2718 · fluent/fluentd · GitHub