Change H2O log format to LTSV

h2oのログをtd-agentを使ってGoogle BigQueryに送っています。

今まで私はtd-agentのtailプラグインの設定で、フォーマットを愚直に正規表現で設定していました。

format /(?<remote_address>[^ ]*) (?<remote_logname>[^ ]*) (?<remote_user>[^ ]*) (?<request_time>[^\]]*) (?<request_line>[^ ]* +\S* +\S*) (?<status_code>[^ ]*) (?<size_of_the_response_body>[^ ]*) "(?<user_agent>[^\"]*)" "(?<referer>[^\"]*)"/

課題として、以下の不満がありました。

  • 見辛い
  • h2oのログフォーマットを変えたとき追従して正規表現を書き直さないといけない

そこでh2oのアクセスログのフォーマットをLTSVに変更してtd-agentでltsvフォーマットを使えるようにしました。

h2oの設定変更

下記のようにスペース区切りだったものを、

format: "%h %l %u %{%Y/%m/%d:%H:%M:%S}t \"%r\" %s %b \"%{User-agent}i\" \"%{Referer}i\""

LTSVに変更しました。

format: "remote_address:%h\tremote_logname:%l\tremote_user:%u\trequest_time:%{%Y/%m/%d:%H:%M:%S}t\trequest_line:\"%r\"\tstatus_code:%s\tsize_of_the_response_body:%b\tuser_agent:\"%{User-agent}i\"\treferer:\"%{Referer}i\""

td-agentの設定変更

formatをltsvに変更しました。シンプル!

format ltsv

ついでに日付のフォーマットも変える

Google BigQueryのTIMESTAMP型が使える形にしたかったので、h2oの日付のフォーマットをいじります。

こんなフォーマットだったのを、

  • 2017/02/14:00:00:00
request_time:%{%Y/%m/%d:%H:%M:%S}t

こうしました。

  • 2017-02-14 00:00:00.000000
request_time:%{%Y-%m-%d %H:%M:%S}t.%{usec_frac}

これでTIMESTAMP型を使えるようになったので、td-agentのスキーマファイルを修正します。

     "name": "request_time",
 -    "type": "STRING"
 +    "type": "TIMESTAMP"
    },

トラブル発生

変更したところGoogle BigQueryにログが送られなくなってしまいました。これは既存のテーブルのスキーマと異なるスキーマでデータを送ろうとしたためだと思われます。

めんどうなので一旦テーブルを削除しました。削除後td-agentによって新しくテーブルが作成され、ログも送られるようになりました。

感想

既存のテーブルのスキーマを変えるのは割と面倒なので初期の段階でスキーマ設計はちゃんとしておきたい。

これでh2oのログフォーマットをいじった際に一緒に変更しなければならないファイルがスキーマファイルだけになったのでハッピー!✨

ついでにTIMESTAMP型にできたからGoogle BigQueryでの操作が捗りそう!

今後やること

これでh2oのログフォーマットを気軽にいじれるようになったので、今のテキトーなログフォーマットをいじって色々情報取れるように変更する。(๑•̀ㅂ•́)و✧

参考