追記 2014年2月19日
本記事の初投稿後に修正がかなり入っているので、最新の利用方法についてはglidenote/fluent-plugin-tai64n_parserを参照ください。
TAI64N好きですか!!qmailのログとかでよく見る下記みたいなやつ。
1
2
3
4
5
6
7
| @4000000052fafd8d3298434c new msg 3890
@4000000052fafd8d32984b1c info msg 3890: bytes 372 from <root@**********.pb> qp 31835 uid 0
@4000000052fafd8d373b5dbc starting delivery 9: msg 3890 to remote glidenote@********.co.jp
@4000000052fafd8d373b6974 status: local 0/120 remote 1/60
@4000000052fafd8d38754cec delivery 9: success: ***.***.***.***_accepted_message./Remote_host_said:_250_ok_1392180611_qp_10394/
@4000000052fafd8d387554bc status: local 0/120 remote 0/60
@4000000052fafd8d387554bc end msg 3890
|
私は大嫌いで見たくないです。見たくないけど残念ながら結構見かけるし、Fluentdにただ流してもナノ秒が処理が出来ないので
TAI64N形式のタイムスタンプをparseするfluent-plugin-tai64n_parser
というものを作った。
既に本番サーバに投入して毎分30000メッセージくらい処理させてるけど、負荷もなく安定して動いてる。
設定例
1
2
3
4
5
6
7
| <match test.**>
type tai64n_parser
key tai64n
output_key parsed_time
add_tag_prefix parsed.
</match>
|
下記みたいなメッセージが流れてくると
1
2
3
| "test" => {
"tai64n" => "@4000000052f88ea32489532c"
}
|
下記のようにtai64nlocal
かけたときと同じようにparseされる。
1
2
3
4
| "parsed.test" => {
"tai64n" => "@4000000052f88ea32489532c"
"parsed_time" => "2014-02-10 17:32:25.612979500",
}
|
qmailの送信ログを処理してみる
たとえばqmailの送信ログを処理する場合は、下記のような感じで設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <match raw.qmail.sent>
type parser
remove_prefix raw
format /^(?<tai64n>[^ ]+) (?<message>(((?:new|end) msg (?<key>[0-9]+)|info msg (?<key>[0-9]+): bytes (?:\d+) from <(?<address>[^>]*)> |starting delivery (?<delivery_id>[0-9]+): msg (?<key>[0-9]+) to (?:local|remote) (?<address>.+)|delivery (?<delivery_id>[0-9]+))?.*))$/
key_name message
suppress_parse_error_log true
</match>
<match qmail.sent>
type tai64n_parser
key tai64n
output_key parsed_time
add_tag_prefix parsed.
</match>
<match parsed.qmail.sent>
type file
path /var/log/td-agent/qmail_tai64n_parsed.log
</match>
|
すると下記みたいな感じでパースされて、ナノ秒単位でparsed_time
に変換された時間が入ってくる。
1
2
3
4
5
6
7
| 2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d3298434c","message":"new msg 3890","key":"3890","parsed_time":"2014-02-12 13:50:11.848839500"}
2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d32984b1c","message":"info msg 3890: bytes 372 from <root@**********.pb> qp 31835 uid 0","key":"3890","address":"root@**********.pb","parsed_time":"2014-02-12 13:50:11.848841500"}
2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d373b5dbc","message":"starting delivery 9: msg 3890 to remote glidenote@**********.co.jp","key":"3890","address":"glidenote@**********.co.jp","delivery_id":"9","parsed_time":"2014-02-12 13:50:11.926637500"}
2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d373b6974","message":"status: local 0/120 remote 1/60","parsed_time":"2014-02-12 13:50:11.926640500"}
2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d38754cec","message":"delivery 9: success: ***.***.***.***_accepted_message./Remote_host_said:_250_ok_1392180611_qp_10394/","delivery_id":"9","parsed_time":"2014-02-12 13:50:11.947211500"}
2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d387554bc","message":"status: local 0/120 remote 0/60","parsed_time":"2014-02-12 13:50:11.947213500"}
2014-02-12T13:50:11+09:00 parsed.qmail.sent {"tai64n":"@4000000052fafd8d387554bc","message":"end msg 3890","key":"3890","parsed_time":"2014-02-12 13:50:11.947213500"}
|
上の例だとfluent-plugin-tai64n_parser
でparse後に、sonots/fluent-plugin-record-reformerのようなプラグインを使って
tai64n
自体のキーを消して、DBに入れればTAI64N形式のタイムスタンプを二度と見なくて良くなる。
参考