👻

nginxのログをBigQueryにインポートする

2020/10/01に公開

はじめに

nginxのログをBigQueryにインポートする設定のメモです。
手順の詳細は省略していますが、おおまかな設定などの参考になると思います。

この記事ではnginxを例として使っていますが、Apacheの場合は適宜読み替えてください。

必要なもの

以下のもののインストールや準備が必要です。

  • BigQuery
  • nginx
  • fluentd
  • fluentd-agent-lite

BigQuery

ログを受け取るテーブルを作成しておきます。

time    INTEGER REQUIRED
size    INTEGER NULLABLE
reqsize INTEGER NULLABLE
status  INTEGER NULLABLE
host    STRING  NULLABLE
uri     STRING  NULLABLE
method  STRING  NULLABLE
referer STRING  NULLABLE
ua      STRING  NULLABLE
vhost   STRING  NULLABLE
reqtime FLOAT   NULLABLE
apptime FLOAT   NULLABLE

全部REQUIREDで良い気もしますが、何となくNULLABLEになっています。

nginx

LTSV形式でログを出力するようにします。

log_format  ltsv  "time:$time_local"
                  "\thost:$remote_addr"
                  "\turi:$request_uri"
                  "\tstatus:$status"
                  "\tsize:$body_bytes_sent"
                  "\treqsize:$content_length"
                  "\tmethod:$request_method"
                  "\treferer:$http_referer"
                  "\tua:$http_user_agent"
                  "\treqtime:$request_time"
                  "\tapptime:$upstream_response_time"
                  "\tupstream:$upstream_addr"
                  "\tvhost:$host";

...

access_log          /var/log/nginx/access.log  ltsv;

通常の形式でも問題はありませんが、他にも何かと便利なのでLTSV形式を使っています。

fluent-agent-lite

保存したログは、fluent-agent-lite によって fluentd へ転送します。

TAG_PREFIX=""
LOGS=$(cat <<"EOF"
raw.nginx.access /var/log/nginx/access.log
EOF
)
PRIMARY_SERVER="xxx.xxx.xxx.xxx:24224"

fluentd

LTSV形式のアクセスログをparseします。

<match raw.nginx.*>
  type parser
  format ltsv
  remove_prefix raw
  key_name message
  time_format %d/%b/%Y:%H:%M:%S %z
</match>

parseされたものをBigQueryに保存します。

<match nginx.access>
  type copy
  <store>
    type              bigquery
    method            insert
    auth_method       private_key
    email             youraccount@developer.gserviceaccount.com
    private_key_path  /etc/td-agent/bigquery.p12
    project           yourproject
    dataset           mixch
    table             http_%y%m
    time_format       %s
    time_field        time
    field_integer     time,size,reqsize,status
    field_string      host,uri,method,referer,ua,vhost
    field_float       reqtime,apptime
  </store>

  ...

</match>

fluent-plugin-bigquery は table のパラメータに日付のフォーマットを使うことが出来ます。

すべてのログを1つのテーブルに保存するのではなく、月ごとなどに分割することで、クエリのスキャンするデータ量を抑制するなどの効果があります。BigQueryは複数のテーブルに対してクエリを実行できるので、月をまたいだクエリも可能なため分割が問題にはなりません。

この記事はQiitaの記事をエクスポートしたものです

Discussion