Add logsource hostname to record

bigqueryに送るレコードに送り元のホスト名を追加してみます。

送り元ホストを条件に検索できるようになります。今のところ個人で複数のサーバを運用する予定はないので別に送り元ホストを条件に検索することも無いのですが、こまけーこたぁいいんだよ!

filterプラグイン(組み込み)を利用して実現します。

filterプラグインを使うと、td-agentのレコード(tailしたログファイルの行など)にデータを追加することが出来ます。

イメージ的には以下のような感じでしょうか。

[time, tag, record = {ip: "1.2.3.4", status: "200"}]

[time, tag, record = {ip: "1.2.3.4", status: "200", logsource_hostname: "ponpokopon.me"}]

td-agentの(fluentdの)データ構造については、以下の記事が分かりやすかったです。

設定の差分は↓

td-agent.conf

  <source>
    @type tail
    format /(?<remote_address>[^ ]*) (?<remote_logname>[^ ]*) (?<remote_user>[^ ]*) (?<request_time>[^\]]*) (?<request_line>[^ ]* +\S* +\S*) (?<status_code>[^ ]*) (?<size_of_the_response_body>[^ ]*) "(?<user_agent>[^\"]*)" "(?<referer>[^\"]*)"/
    path /var/log/h2o/access.log
    tag h2o.access
    pos_file /var/log/td-agent/h2o.access.pos
  </source>

+ <filter h2o.**>
+   @type record_transformer
+   <record>
+     logsource_hostname ${hostname}
+   </record>
+ </filter>

  <match h2o.**>
    @type bigquery
    method insert

    auth_method json_key
    json_key キー

    project プロジェクトID
    dataset prod
    table h2o_access_log_%Y_%m_%d

    auto_create_table true
    schema_path /etc/td-agent/schema-bigquery-h2o.json
  </match>

スキーマ定義ファイルも忘れずに!

schema-bigquery-h2o.json

  [
    {
      "name": "remote_address",
      "type": "STRING"
    },

    ...

    {
      "name": "referer",
      "type": "STRING"
-   }
+   },
+   {
+     "name": "logsource_hostname",
+     "type": "STRING"
+   }
  ]

注意点としては、matchの後にfilterを書くと読み込まれないという点でしょうか。これはハマりました。

bqコマンドで確認。

$ bq query "SELECT logsource_hostname,request_line,status_code FROM prod.h2o_access_log_2016_10_20 LIMIT 10"
Waiting on bqjob_qwertyuiopasdfghj_qwertyuiopasdfghj_0 ... (0s) Current status: DONE
+--------------------+------------------------------------------------------------------------------------------------+-------------+
| logsource_hostname |                                          request_line                                          | status_code |
+--------------------+------------------------------------------------------------------------------------------------+-------------+
| ponpokopon.me      | "GET /content/images/2016/10/photo-1470681151804-311e1b738c23.jpeg HTTP/1.1"                   | 200         |
| ponpokopon.me      | "GET /song/song-sanam-rey.html HTTP/1.1"                                                       | 302         |
| ponpokopon.me      | "GET / HTTP/1.1"                                                                               | 200         |
| ponpokopon.me      | "GET /author/lorentzca/ HTTP/1.1"                                                              | 200         |
| ponpokopon.me      | "HEAD / HTTP/1.1"                                                                              | 302         |
| ponpokopon.me      | "HEAD / HTTP/1.1"                                                                              | 302         |
| ponpokopon.me      | "GET /assets/css/escoreUi.css/ HTTP/1.1"                                                       | 301         |
| ponpokopon.me      | "GET /search/Qelt+Noom+Shereen+2014/feed/rss2/ HTTP/1.1"                                       | 302         |
| ponpokopon.me      | "GET /online-cv-template/creative-cv-template-18-for-hotel-and-restaurant-in-yellow/ HTTP/1.1" | 404         |
| ponpokopon.me      | "GET /song/download-bokep-sd.html HTTP/1.1"                                                    | 302         |
+--------------------+------------------------------------------------------------------------------------------------+-------------+

やったね!